脚本中有多个单引号

时间:2018-02-08 15:17:05

标签: linux shell

所以我在下面有这个脚本ssh到不同的服务器并将ulimit从一个值更改为另一个值。

for host in $(</tmp/server_list.txt); do
ssh $host 'hostname -s; sudo sed -i.20180206 's/20480/40960/g'' /etc/security/limits.conf 
done

问题是因为我们有多个单引号开始和结束脚本不工作

有人可以帮助修改或建议我们可以使用的替代单引号的替代方案吗?

2 个答案:

答案 0 :(得分:0)

可以通过管道向ssh发送命令。

一种方法是:

echo "commands" | ssh user@host

在你的情况下你可以写:

for host in $(</tmp/server_list.txt); do
  echo "hostname -s; sudo sed -i.20180206 's/20480/40960/g' /etc/security/limits.conf" \
      | ssh $host
done

从文件中读取行的更好方法是使用Bash的内置命令read。将此与将多个参数传递给ssh相结合,它看起来像这样:

while read host; do
    ssh $host hostname -s; sudo sed -i.20180206 s/20480/40960/g /etc/security/limits.conf
done < /tmp/server_list.txt

这更简单。

答案 1 :(得分:0)

s/20480/40960/g周围的简单引号不是必需的,因为它不包含特殊字符。另外,为了便于阅读,我建议将整个命令放在ssh的单个参数中执行(包括/etc/security/limits.conf):

for host in $(</tmp/server_list.txt); do
    ssh $host "hostname -s; sudo sed -i.20180206 s/20480/40960/g /etc/security/limits.conf"
done

或相反,在其自己的ssh参数中传递每个参数:

for host in $(</tmp/server_list.txt); do
    ssh $host hostname -s \; sudo sed -i.20180206 s/20480/40960/g /etc/security/limits.conf
done