我已经有一个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';"

因为它极其丑陋,难以阅读。


当前回答

使用多行字符串和多个bash脚本发布的答案不适合我。

长多行字符串很难维护。 单独的bash脚本不维护局部变量。

下面是一种实用的ssh和运行多个命令的方法,同时保持本地上下文。

LOCAL_VARIABLE=test

run_remote() {
    echo "$LOCAL_VARIABLE"
    ls some_folder; 
    ./someaction.sh 'some params'
    ./some_other_action 'other params'
}

ssh otherhost "$(set); run_remote"

其他回答

使用多行字符串和多个bash脚本发布的答案不适合我。

长多行字符串很难维护。 单独的bash脚本不维护局部变量。

下面是一种实用的ssh和运行多个命令的方法,同时保持本地上下文。

LOCAL_VARIABLE=test

run_remote() {
    echo "$LOCAL_VARIABLE"
    ls some_folder; 
    ./someaction.sh 'some params'
    ./some_other_action 'other params'
}

ssh otherhost "$(set); run_remote"

为了匹配示例代码,可以将命令包装在单引号或双引号中。例如

ssh blah_server "
  ls
  pwd
"

对于简单的命令,您可以使用:

ssh <ssh_args> command1 '&&' command2

or

ssh <ssh_args> command1 \&\& command2

对于任何像我一样在这里出错的人,我成功地逃脱了分号和换行符:

第一步:分号。这样,我们就不会破坏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 user@host "cmd1; cmd2; cmd3"