2016-07-25 176 views
2

我想在本地系统上运行一个命令,同时我在bash中向远程系统sshd。有没有办法做到这一点?这就是我想要的:在bash上在ssh上运行命令

#!/bin/bash 

ssh [email protected] <<'SSH' 
#Do something 
#Run a command here on local machine and not on machine I have sshed to 
#Do Something 

exit 
SSH 

编辑:我想呼应的一些消息,因为回声命令的输出将不会从远程计算机显示,我想从本地运行。

+2

你可以做另一种方式:保持本地和发送命令到远程 – stzahi

+3

你究竟* *试图做什么?虽然回答这个问题可能会让你继续处理它,但这听起来像一个[XY问题](http://mywiki.wooledge.org/XyProblem)。如果您向我们提供更多信息,我们完全可以帮助您以更好的方式解决问题。 – ghoti

+0

我增加了我想要做的更多细节 –

回答

2

如果你可以改变脚本,您可以使用,一个expect脚本 - expect_example_and_tips

这可以让你启动一个“的ssh进程”,其可以发送命令到远程机器上,而仍然在运行本地机器。

#!/usr/bin/env python 

import pexpect 

PROMPT = "\$|\%|\>" 
ssh_cmd = "ssh [email protected]" 

try: 
    ssh = pexpect.spawn(ssh_cmd) 
    ssh.sendline("echo hello on remote") 
    ssh.expect(PROMPT) 
    print "hello on local machine" 
    ssh.close() 

except Exception as e: 
    print e 
    sys.exit(2) 
+0

我只是想在运行远程命令时回显一些内容。 –

+0

因此,请使用expect来按我的建议运行远程命令,并且可以根据需要进行回显,因为您在本地计算机上。恐怕我不知道另一种方法来绕过这个 - 我在Bash中使用pexpect模块在Python中首先执行相同的操作 - 使用起来非常方便。 – tomereli

+0

所以你的答案是“你可以使用这个其他工具,这里有一个链接,但我不会使用这个或你所问的东西,我会使用其他东西,我没有提供完整的例子“?呃...你会不会改善你的回答? – ghoti

5

当您使用SSH,关键序列<enter>~是一种逃避的前缀,使您可以暂停SSH和发送键序列到SSH客户端:例如 -

虽然在我看来

在Python更加简单。在主机端。 序列号<enter>~<ctrl + z>将暂停(停止)ssh-client作业,并让您在调用系统中提示。键入fg(如果您在Unix shell中)将在以后恢复您的ssh会话。

您可以通过键入<enter>~?来查看其他ssh转义序列。 顺序<enter>~.将终止连接,并且在会话在远程计算机上被锁定时非常方便。

(与使用~作为一个死键组成的口音和双字母组合的非美国键盘布局用户有,显然,在所有这些序列类型~两次)

这些序列是利用从当您正在操作SSH会话和d typign命令,而不是脚本。

由于您似乎希望在脚本中使用该方法,因此直接的解决方案是将ssh命令包含回原始主机。

+0

我基本上想在自动脚本中回应一些东西。 echo不会在远程计算机上运行 –

+0

否 - 这些序列适用于在终端“活动”的情况,而不适用于脚本。 – jsbueno