2017-06-04 83 views
0

什么是很好的方式来SSH和运行Korn shell中的多个命令?我碰到相关的question和最佳答案适合我,但我指定/ bin/bash /在此并通过korn shell运行它。Ksh,更好的方式来SSH和运行多个命令

可以在命令列表下运行(从引用问题的答案中复制)还是可以有更好的方式来运行ksh?

ssh otherhost /bin/bash << EOF 
    ls some_folder; 
    ./someaction.sh 'some params' 
    pwd 
    ./some_other_action 'other params' 
EOF 
+0

的错误情况,你是否尝试过与运行的ksh的例子吗? (如有疑问,请尝试一下!);如果您收到错误...提供您的完整示例和错误;你对'更好'的想法是什么,你试图完成这个例子(或者那个链接上的其他例子)没有解决什么? – markp

+0

@markp正如沟通的问题是,我试过了,它也运行良好,所以没有错误。在命令中我使用/ bin/bash /但是我在korn shell中,这就是为什么我问是否有其他方式使用ksh而不使用bash。 – Vipin

+0

我的意思是:用/ bin/ksh替换/ bin/bash(或者你的ksh的适当路径),看看会发生什么。 – markp

回答

0

无论您使用的是什么外壳。我宁愿坚持其中一个答案中提供的解决方案,即建议使用连接复用

这是什么?您将运行单独的ssh命令,但所有这些命令都将在单个TCP连接中运行。

以及如何实现这一目标?具有类似内容的创建~/.ssh/config配置文件:

Host otherhost 
    ControlPath ~/.ssh/controlmasters/%[email protected]%h:%p 
    ControlMaster auto 
    ControlPersist yes 

然后运行命令,你会在本地运行(与ssh server前缀)。第一个将启动连接,另一个将使用它

ssh otherhost ls some_folder; 
ssh otherhost ./someaction.sh 'some params' 
ssh otherhost pwd 
ssh otherhost ./some_other_action 'other params' 
+0

一个问题与可能的复制使用ssh/multiplexing(假设每个ssh调用单个命令 - 按照您的示例)是,连续的命令不能依赖于先前命令的结果(即每个调用在主目录中开始(over));简单的例子:cd/tmp; pwd ...当在HERE文件中以2行提交时,pwd返回/ tmp ...当作为2个独立的ssh/cmd调用提交时,pwd返回/ remote/home /目录;问题在于解决方案(HERE文档; ssh/multiplexing;其他)必须考虑所需的一系列操作以及它们是否可以独立运行 – markp

+1

@markp显然,这可能是一个缺点,但它也可以还有一个好处就是不能搞乱其他环境。显然,这些命令之间的依赖关系的要求没有说明,因此我提供了这种最先进的解决方案作为一个选项,用于HERE文档和其他提及的解决方案中的HERE文档中的丑陋bash重定向,这些解决方案限制了可用性(在与脚本交互的名称,其他重定向等)。 – Jakuje

2

是的,那是有效的。但是如果以后的命令如果先前的命令失败了,那么如果之前的命令失败了,最好停止链。

一个简单的方法是链& &

 A && B && { C || true $? } && D

或者,

 A && 
    B && 
    { C || true $? } && 
    D

C上的把戏允许命令失败,但保持链去...的grep命令一起如果没有任何匹配,通常需要继续。 $?的参数真正什么都不做,除非下集运行-x,那么它会跟踪C.