在Bash中ssh和运行多个命令最干净的方法是什么?
我已经建立了一个ssh代理,并且我可以在Bash脚本的外部服务器上运行命令,执行如下操作:
ssh blah_server "ls; pwd;"
现在,我真正想做的是在外部服务器上运行很多长命令。 将所有这些用引号括起来都是相当难看的,为避免这种情况,我宁愿多次避免ssh'ing。
那么,我有办法一次性完成这个任务吗? 我正在寻找的东西沿线:
ssh blah_server (
ls some_folder;
./someaction.sh;
pwd;
)
基本上,只要干净,我都会很满意。
编辑
为了澄清,我正在谈论这是一个更大的bash脚本的一部分。 其他人可能需要处理脚本,所以我想保持清洁。 我不想让一行看起来像这样的bash脚本:
ssh blah_server "ls some_folder; ./someaction.sh 'some params'; pwd; ./some_other_action 'other params';"
因为它非常丑陋难读。
如何在这里打击文件:
ssh otherhost << EOF
ls some_folder;
./someaction.sh 'some params'
pwd
./some_other_action 'other params'
EOF
为了避免评论中@Globalz提到的问题,你可以(取决于你在远程站点上做什么)用第一行代替
ssh otherhost /bin/bash << EOF
请注意,您可以在Here文档中进行变量替换,但是您可能需要处理引用问题。 例如,如果引用“限制字符串”(即上面的EOF
),则不能执行变量替换。 但是,如果不引用限制字符串,则会替换变量。 例如,如果您在shell脚本中定义$NAME
上面的$NAME
,那么您可以这样做
ssh otherhost /bin/bash << EOF
touch "/tmp/${NAME}"
EOF
它会在目标otherhost
上创建一个文件,其名称为您分配给$NAME
的任何$NAME
。 有关shell脚本引用的其他规则也适用,但这些规则太复杂了。
在本地编辑脚本,然后将其管理到ssh中,例如
cat commands-to-execute-remotely.sh | ssh blah_server
其中commands-to-execute-remotely.sh
与上面的列表类似:
ls some_folder
./someaction.sh
pwd;
我看到两种方式:
首先你做一个这样的控制插座:
ssh -oControlMaster=yes -oControlPath=~/.ssh/ssh-%r-%h-%p <yourip>
并运行你的命令
ssh -oControlMaster=no -oControlPath=~/.ssh/ssh-%r-%h-%p <yourip> -t <yourcommand>
这样你就可以编写一个ssh命令而不需要重新连接服务器。
第二是动态生成脚本, scp
荷兰国际集团,并运行。
上一篇: What is the cleanest way to ssh and run multiple commands in Bash?
下一篇: Need to execute a shell script in different unix servers