在多行上编写SSH命令

31

我正在尝试远程登录到一个shell并在shell上执行一堆命令。但为了使它更易读,我想将我的代码放在多行上。我应该如何做呢?

ssh -o <Option> -x -l <user> <host> " $long_command1; $long_command2; ....  "

谢谢!

3个回答

47

ssh 实际上只是传递一个字符串到远程主机。在那里,这个字符串被传递给一个shell,它应该解释它(用户的登录shell,通常是类似 bash 的东西)。因此,你想要执行的任何内容都需要由远程登录shell来解释,这就是你必须遵循的整个规则。

你确实可以在命令字符串中使用换行符:

ssh alfe@sweethome "
  ls /home/alfe/whatever
  ping foreignhost
  date
  rm foobar
"

你可能想看一下我最近关于将变量传递到ssh远程shell的回答。链接在这里:http://stackoverflow.com/questions/32019076/having-an-issue-passing-variables-to-subshell/32019393#32019393 - Alfe

32

你可以使用bashHere Documents功能。类似于:

ssh <remote-host> bash <<EOF
echo first command
echo second command
EOF

文件结束标记(EOF)表示输入的结尾。

更多信息请参阅man bash并搜索Here Documents

编辑:唯一的注意事项是使用变量可能会有些棘手,您必须转义$以保护它们不被评估为远程主机而不是本地shell中的变量。例如:\$HOSTNAME。否则,可以与从bash运行并使用stdin的所有内容一起使用。


这里将使用远程用户的bash shell吗? - dspshyama
@ShyamaDorbala:是的,远程Bash。事实上,甚至不需要bash,只需使用“HereDocing”到SSH即可。 - ntki
有意思,我会去看看。谢谢! - dspshyama
我喜欢这个解决方案,但希望它在缩进方面能更好地工作。前导空格会破坏它(但前导制表符是可以的)。 - Joe Coder
1
作为转义的替代方案,您可以使用<<"EOF"来停止本地shell中的评估。 - siwyd

2
你可以像下面的例子一样操作。
ssh -o <Option> -x -l <user> <host> '
pwd
whoami
ls
echo "$PATH"
'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接