我已经有一个ssh代理设置,我可以在外部服务器上运行命令在Bash脚本做这样的事情:
ssh blah_server "ls; pwd;"
现在,我真正想做的是在外部服务器上运行大量长命令。把所有这些都放在引号之间会很难看,为了避免这种情况,我真的宁愿避免多次ssh。
有没有一种方法可以一次性完成,用括号括起来?我想要的是:
ssh blah_server (
ls some_folder;
./someaction.sh;
pwd;
)
基本上,我对任何解决方案都很满意只要它是干净的。
Edit
为了澄清,我说的是这是一个更大的bash脚本的一部分。其他人可能需要处理脚本,所以我希望它保持干净。我不想有一个bash脚本与一行看起来像:
ssh blah_server "ls some_folder; ./someaction.sh 'some params'; pwd; ./some_other_action 'other params';"
因为它极其丑陋,难以阅读。
对于任何像我一样在这里出错的人,我成功地逃脱了分号和换行符:
第一步:分号。这样,我们就不会破坏ssh命令:
ssh <host> echo test\;ls
^ backslash!
列出了远程主机/home目录(以根用户登录),而
ssh <host> echo test;ls
^ NO backslash
列出当前工作目录。
下一步:拆分行:
v another backslash!
ssh <host> echo test\;\
ls
这再次列出了远程工作目录-改进的格式:
ssh <host>\
echo test\;\
ls
如果真的比这里的文档或虚线周围的引号更好-好吧,不是我说了算…
(使用bash, Ubuntu 14.04 LTS)
配置系统使用单ssh会话的最简单方法是默认使用多路复用。
这可以通过为套接字创建一个文件夹来完成:
mkdir ~/.ssh/controlmasters
然后将以下内容添加到您的.ssh配置中:
Host *
ControlMaster auto
ControlPath ~/.ssh/controlmasters/%r@%h:%p.socket
ControlMaster auto
ControlPersist 10m
现在,您不需要修改任何代码。这允许在不创建多个会话的情况下对ssh和scp进行多次调用,这在本地和远程机器之间需要更多交互时非常有用。
感谢@terminus的回答,http://www.cyberciti.biz/faq/linux-unix-osx-bsd-ssh-multiplexing-to-speed-up-ssh-connections/和https://en.wikibooks.org/wiki/OpenSSH/Cookbook/Multiplexing。