(如果你有答案,请发一个经过测试的剧本,因为我已经尝试过完美的理论剧本并且它没有工作)
我在python中有一个cronjob,通过ssh隧道连接到外部服务器,在那里读取和写入MySQL数据库。
python程序打开一个ssh隧道并将mysql端口绑定到本地端口,然后通过pymysql库连接到外部数据库,就好像它是本地的一样。
一切正常,但是......我无法通过同一个程序打开和关闭隧道。所以,我必须手动打开一个隧道,让它打开-f -N -T参数到shh。
它运作正常,但我希望程序可以管理隧道而无需打开隧道。我无法为此获得正确的参数。
我在互联网上读到了一些答案,这些答案意味着等待隧道打开,然后通过杀死操作系统中的de进程来关闭。我不喜欢那些解决方案。事实上,我可以使用以下命令执行此操作:
sys_command = "ssh -T -f user@external.server -i /home/user/.ssh/id_rsa -p 22222 -L 3310:localhost:3306"
prog = subprocess.Popen(sys_command, stdout=subprocess.PIPE , stderr=subprocess.PIPE , shell = True)
out,err = prog.communicate()
然后我用:
连接到数据库con_test = pymysql.connect(user=conf.dbUser, passwd=conf.dbPass, host='localhost', port = 3310, db=conf.database)
它在另一个环境中工作,但是当我现在尝试它时,我得到了:
如果没有执行命令,就无法进入后台。
我尝试过很多参数组合。唯一有效的是:
ssh -f -N -T .....
但是,正如我所说,这会无限期地打开一条隧道。
我也尝试过使用Popen(用参数和逗号分隔参数和Shell = False):
sys_command = ["ssh","-f","-T","user@external.server","-i","/home/user/.ssh/id_rsa","-p","22222","-L","3310:localhost:3306"]
prog = subprocess.Popen( sys_command, stdout=subprocess.PIPE , stderr=subprocess.PIPE , shell = False)
但我得到同样的错误。
但是,哦,出乎意料的是,如果我在那里制作一个红色的技巧,我会添加"睡眠"," 10"到最后:
sys_command = ["ssh","-f","-T","user@external.server","-i","/home/user/.ssh/id_rsa","-p","22222","-L","3310:localhost:3306","sleep","10"]
...我通过外人从其他服务器得到问候语! 以及,错误:
bind:无法分配请求的地址
因此,如果有人知道正确的方法,请使用经过测试的脚本回答,因为我在互联网上找到的许多解决方案都不能在我的环境中工作。
提前致谢。