Linux 如何使用python在后台运行ssh反向隧道?
我需要执行命令ssh-NTf-r5000:localhost:22server@ip在后台使用python。由于选项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
-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)
...