使用 sed 附加带有远程 ssh 的字符串无法正常工作

Using sed to append string with remote ssh not working expected

我想将一些文本附加到远程文件,但下面的命令可以在本地成功执行,但使用 ssh 失败。

命令 1,失败:

for i in $(cat serverlist.txt);do ssh user@$i sed -i "$a  a"  /tmp/test.txt;done
sed: -e expression #1, char 3: expected \ after `a', `c' or `i'
sed: -e expression #1, char 3: expected \ after `a', `c' or `i'
sed: -e expression #1, char 3: expected \ after `a', `c' or `i'

command2 成功:

for i in $(cat serverlist.txt);do ssh user@$i sed -i "$a  t"  /tmp/test.txt;done

command3 失败:

for i in $(cat serverlist.txt);do ssh -T user@$i  sed -i  '$a vm.max_map_count=655360\nfs.aio-max-nr=1048576'  /tmp/test.txt;done
sed: -e expression #1, char 45: expected newer version of sed
sed: -e expression #1, char 45: expected newer version of sed
sed: -e expression #1, char 45: expected newer version of sed

command4 成功:

echo " sed -i  '$a vm.max_map_count=655360\nfs.aio-max-nr=1048576'  /tmp/test.txt" >sed.cmd
for i in $(cat serverlist.txt);do ssh -T user@$i  $(cat sed.cmd)  /tmp/test.txt;done

非常感谢!

您需要转义或引用来自本地和远程的字符串 shell。

切向,也 don't read lines with for

while IFS='' read -r host; do
    ssh user@"$host" "sed -i '$a vm.max_map_count=655360\nfs.aio-max-nr=1048576' /tmp/test.txt"
done <serverlist.txt

注意远程命令周围的双引号,反斜杠转义以引用美元符号和双引号内的文字反斜杠。