问题
我已经设置好了ssh代理,我可以用Bash脚本在外部服务器上运行命令,执行以下操作:
代码语言:javascript复制ssh blah_server "ls; pwd;"
现在,我真正想做的是在外部服务器上运行许多长命令。将所有这些命令都放在引号之间看起来会很不美观,而且我确实不想为了避开这个问题而多次使用SSH连接。
那么,有没有一种方法可以让我一次性完成这个操作,比如用括号或其他方式来包含所有的命令?我在寻找类似这样的方法:
代码语言:javascript复制ssh blah_server (
ls some_folder;
./someaction.sh;
pwd;
)
基本上,只要解决方案干净利落,我都会感到满意。
回答
使用 Here-Document:
代码语言:javascript复制ssh user@remote_host << EOF
命令1
命令2
命令3
EOF
不过这样执行会有一个问题:
输出信息的开头都有一句提示 "Pseudo-terminal will not be allocated because stdin is not a terminal."
如果要避免这个提示信息,可以将上述命令的第一行改为
代码语言:javascript复制ssh user@remote_host /usr/bin/bash << EOF
朋友们可以拿手上的测试环境试一试。
参考
- stackoverflow question 4412238
- man ssh