我已经设置了ssh代理,我可以在Bash脚本中运行外部服务器上的命令,例如:
ssh blah_server "ls; pwd;"
Run Code Online (Sandbox Code Playgroud)
现在,我真正想做的是在外部服务器上运行很多长命令.将所有这些包含在引号之间会非常难看,而且我宁愿多次避免ssh'ing以避免这种情况.
那么,有没有一种方法可以用括号括起来的一个方法做到这一点?我正在寻找以下内容:
ssh blah_server (
ls some_folder;
./someaction.sh;
pwd;
)
Run Code Online (Sandbox Code Playgroud)
基本上,只要它干净,我会对任何解决方案感到满意.
为了澄清,我在谈论这是一个更大的bash脚本的一部分.其他人可能需要处理脚本,所以我想保持清洁.我不希望有一个bash脚本,其中一行看起来像:
ssh blah_server "ls some_folder; ./someaction.sh 'some params'; pwd; ./some_other_action 'other params';"
Run Code Online (Sandbox Code Playgroud)
因为它非常丑陋且难以阅读.
我有
var="a b c"
for i in $var
do
p=`echo -e $p'\n'$i`
done
echo $p
Run Code Online (Sandbox Code Playgroud)
我想要打印最后一个回声
a
b
c
Run Code Online (Sandbox Code Playgroud)
请注意,我希望变量p包含换行符.我怎么做?
似乎在这个问题中,答案是用分号分隔语句.但是,如果我们使用多个if语句和复杂的引用字符串进入复杂的脚本,那么这可能会变得很麻烦.我想.
我想另一个替代方案是简单地一个接一个地发出多个SSH命令,但这又是麻烦的,而且我没有设置公钥/私钥认证,所以这将要求密码多次.
我理想的情况与交互式shell体验非常相似:在脚本中的某一点上你会进入@the_remote_server并提示你输入的密码(交互式地)然后从那一点开始直到你的脚本发布"exit"命令,脚本中的所有命令都在远程机器上解释.
当然这不起作用:
ssh user@host.com
cd some/dir/on/remote/machine
tar -xzf my_tarball.tgz
cd some/other/dir/on/remote
cp -R some_directory somewhere_else
exit
Run Code Online (Sandbox Code Playgroud)
还有另一种选择吗?我想我可以从我的脚本中取出那部分并将其粘贴到远程主机上的脚本中.咩.现在我正在维护两个脚本.另外,我想要一个小配置文件来保存默认值和其他东西,我也不想在两个地方维护它.
还有其他解决方案吗?