Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何使用python在后台运行ssh反向隧道?_Linux_Ssh_Sshd - Fatal编程技术网

Linux 如何使用python在后台运行ssh反向隧道?

Linux 如何使用python在后台运行ssh反向隧道?,linux,ssh,sshd,Linux,Ssh,Sshd,我需要执行命令ssh-NTf-r5000:localhost:22server@ip在后台使用python。由于选项-f,我知道命令本身在后台运行 我使用了python子流程包来实现这一点 cm="ssh -NTf -o ExitOnForwardFailure=yes -o ConnectTimeout=10 -R 5000:localhost:22 servermc@122.174.345.9" try: out=sp.check_output(cm,stderr=sp.STDOU

我需要执行命令ssh-NTf-r5000:localhost:22server@ip在后台使用python。由于选项
-f
,我知道命令本身在后台运行

我使用了python子流程包来实现这一点

cm="ssh -NTf -o ExitOnForwardFailure=yes -o ConnectTimeout=10 -R 5000:localhost:22 servermc@122.174.345.9"

try:
    out=sp.check_output(cm,stderr=sp.STDOUT,shell=True)
except Exception as e:
    print "ddddd",e.output
但实际情况是,这一过程仍处于前景之中。当我们运行上述python代码时,执行在check_output命令处暂停,我需要按
ctrl+c
退出python代码

我还尝试了Popen和poll()函数。使用这些函数,我可以实现所需的功能,但问题是,如果发生任何错误(如端口不可用或ip地址错误),我无法获取状态

我需要做的是,我想在后台使用python运行ssh反向隧道,还需要从服务器端获取状态,看它是否运行成功

我只能访问服务器,上面的脚本将在客户端内部运行。因此,我可以通过服务器访问客户端。如果客户端运行此脚本,状态将被发送到云,以便我可以验证状态并从服务器连接到客户端。

“后台”纯粹是一个shell概念:您可能希望生成一个新进程。
subprocess.Popen()
仅当python脚本中的任何内容都不依赖于正在运行的命令的输出时才运行进程

例如:

import subprocess
subprocess.Popen(["ls","-lha","/"])
如果要检查流程的错误或信息,一种方法是检查该流程的日志

您可以在ssh命令中使用
-E
参数,并将调试日志附加到日志文件中:

ssh -NTf -o ExitOnForwardFailure=yes -o ConnectTimeout=10 -R 5000:localhost:22 servermc@x.x.x.x -E /tmp/ssh.log
使用
subprocess.Popen()
执行ssh命令后,您可以在不暂停的情况下检查日志文件中的任何错误

更新1:
result
脚本中的变量与脚本中的
out
变量完全相同。而且脚本不会卡在
Popen

#!/usr/bin/python
import shlex
from subprocess import Popen, PIPE
import time

tmp_file = "/tmp/ssh.log"   #temp log file address 
cmd="ssh -NTf -o ExitOnForwardFailure=yes -o ConnectTimeout=10 -R 5000:localhost:22 servermc@x.x.x.x -E "+tmp_file  #command to execute

def executor(command):
    try:
        file = open(tmp_file,"w+")  #create or truncates the log file if exist
        p = Popen(shlex.split(command), stdin=PIPE, stdout=PIPE, stderr=PIPE)   #execute the command
        p.wait()
        content = file.read().strip()
        file.close()
        return content
    except Exception as e:
        return e

result = executor(cmd)

print (result)

嗯,有时候把基本命令粘在一起是好的,其他时候有更好的解决方案

深入了解python的方式:

这个脚本是如何使用paramiko(pythonsh库)的一个很好的示例,也是一个完美的工作解决方案。
您不需要生成SSH,只需在Python中完成所有操作。

尝试AutoSh(对于Windows,您可以安装cygwin的AutoSh)


请注意,尽管python程序结束时AutoSh不会退出。如果不想让AutoSh运行,则需要显式地将其杀死。在另一个hnd上,一旦建立了隧道,就可以在不影响隧道的情况下杀死AutoSh——隧道在ssh会话上生效。杀死相关的ssh将终止隧道。

为什么不能使用
Popen
poll
获取状态?这是正常的方法。您还可以使用
communicate
超时,以确定poll是否指示进程仍在运行以获取任何错误消息。如果使用
communicate
,则会发生相同的问题。它将在communicate时暂停。这就是我对
通信
说了一个超时时间
。给它一个2秒的超时时间,如果一切正常,那么你会得到超时异常。如果你没有得到异常,那么可能出了问题。我们如何给通信超时功能?不,我不能使用日志文件,因为远程客户端是not可访问。基本上,客户端将从云下载ip地址和端口,客户端将使用该ip地址和端口运行反向隧道,以便我可以访问客户端pc。问题是,我永远不知道反向隧道是否已启动。因此,我需要使用python获取状态。是的,这是一个调试日志,您可以发现您的客户端是c通过解析日志文件无法访问连接端或远程端。您需要的以及python代码中排除的所有内容都将在该日志中。-E将向文件中附加标准错误日志。嘿,先生,我只能访问服务器。因此,在客户端拥有日志文件对我没有任何好处。嘿,先生,您必须清除并在中指定所有内容你的问题。
import subprocess as sp
import shlex

# cm = "autossh -f -M 15580 -N root@acone3 -R 5580:127.0.0.1:5580 -C -o ExitOnForwardFailure=yes -o ConnectTimeout=10"

cm = "autossh -f -M 15000 -o ExitOnForwardFailure=yes -o ConnectTimeout=10 -R 5000:localhost:22 servermc@122.174.345.9"

cm = shlex.split(cm)
try:
    out=sp.check_output(cm, stderr=sp.STDOUT,shell=True)
except Exception as e:
    print("ddddd", e.output)
...