前言
-
①多行命令使用引号(双引号
""或单引号'')或者自定义首尾定界符(如EOF)来囊括,当使用双引号囊括时,若其中同时也使用了双引号就需要使用转义字符对远程执行命令中的引号进行转义。所以如果远程命令本身包含双引号,建议还是使用首尾定界符,首尾定界符是一个自定义的字符串,可以自定义内容,并且命令结尾处的首尾定界符需要放置于当前行行首 -
②如果远程执行命令中的美元符号
$读取的是远程终端的变量,而非当前终端的变量就需要增加转义字符\来将此美元符号转义,即定义为读取远程终端中设置的变量。同样的,如果在远程执行的命令中定义了变量,读取时同样需要使用\$前缀
脚本示例
示例1:使用双引号
使用此方式远程执行命令时,不主动加载环境变量
#!/bin/bash
# 此脚本用于测试ssh工具远程执行多条命令方式
# 使用的前提是已经设置密钥对并以默认私钥文件名存放在默认路径~/.ssh/下(即ssh免密登录)
# 或者使用-i参数手动指定私钥位置
host=192.168.126.101
ssh tomandersen@$host "
source /etc/profile
echo \$JAVA_HOME
echo 'this is a test!'
"
注意:每行结尾不加分号;,若远程执行的多行命令中存在使用双引号""或者美元符号$的情况,需要使用转义字符\进行转义,前者是因为双引号在本示例中是作为首位定界符只能出现在命令头尾,后者是因为不给美元符号附上转义字符时是默认读取本地变量。同理也可以使用单引号
示例2:使用重定向输入+首尾定界符
使用此方式远程执行命令时,会自动加载环境变量
首尾定界符是用于圈定命令的字符串,字符串内容可以自己定义,如常用的EOF,甚至命名为TEST都行。配合使用输入从定向<<,能够将其圈定的内容作为命令参数输入
#!/bin/bash
# 此脚本用于测试ssh工具远程执行多条命令方式
# 使用的前提是已经设置密钥对并以默认私钥文件名存放在默认路径~/.ssh/下(即ssh免密登录)
# 或者使用-i参数手动指定私钥位置
host=192.168.126.101
ssh tomandersen@$host << EOF
echo \$JAVA_HOME
echo 'this is a test!'
EOF
注意:首尾定界符的结尾符号需要写在行首,否则会报错
若需要清除Pseudo-terminal will not be allocated because stdin is not a terminal输出文本,使用-T或者-q参数即可
host=192.168.126.101
ssh -T tomandersen@$host << EOF
echo \$JAVA_HOME
echo 'this is a test!'
EOF
ssh -q tomandersen@$host << EOF
echo \$JAVA_HOME
echo 'this is a test!'
EOF

本文介绍如何通过SSH在远程服务器上执行多行命令,包括使用双引号、单引号或自定义首尾定界符(如EOF)来避免转义字符的困扰,以及如何正确处理命令中的特殊字符和变量。

3341

被折叠的 条评论
为什么被折叠?



