我想以root权限远程执行程序tcp_sender
,以下功能用于建立ssh连接
def connect(hostname):
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(hostname, username='usr', pkey=paramiko.RSAKey.from_private_key(open('id_rsa'), 'psw'), timeout = 240.0)
return ssh
然后我有3个解决方案:
解决方案A)
ssh = connect(hostname)
chan = ssh.invoke_shell()
chan.send('sudo ./tcp_sender\n')
用这个解决方案,远程tcp_sender
没有执行,我检查了使用ps -ef|grep "tcp_sender"
,没有进程
我试过chan.send('sudo ./tcp_sender > log 2>&1\n')
了,在日志中,它说:
sudo: no tty present and no askpass program specified
解决方案B)
ssh = connect(hostname)
(stdin, stdout, stderr) = ssh.exec_command("[ -f tcp_sender ] && echo 1 || echo 0")
res = stdout.readlines()
print hostname,res[0]
if res[0] == '0\n':
UnusedHostFile.write(hostname+'no tcp_sender exists\n')
else:
chan = ssh.invoke_shell()
chan.send("sudo chmod 777 tcp_sender\n")
# if a tcp_sender is runnning, kill it
chan.send('x=`ps -ef|grep "tcp_sender"|grep -v "grep"|awk \'{print $2}\'`; [ -n "${x}" ] && sudo kill -9 $x\n')
time.sleep(4)
while not chan.recv_ready():
time.sleep(1)
buf = ''
buf +=chan.recv(9999)
print buf
chan.send('sudo ./tcp_sender\n')
使用此解决方案,我只需添加一些不相关的行,然后遥控器tcp_sender
就会运行,例如:
bash-4.0# ps -ef|grep "sender"
root 9348 9325 0 Apr07 ? 00:00:00 sudo ./tcp_sender
root 9349 9348 0 Apr07 ? 00:00:00 ./tcp_sender
但是,它无法正常运行(如预期的那样)。在 中tcp_sender
,有一个fork()
,也许是因为这个?
我试过chan.send('sudo ./tcp_sender > log 2>&1\n')
了,在日志中,它是空的。因为我的程序中有很多错误检查相关printf
,tcp_sender
所以我认为日志中应该有printf
结果,但它是空的。
另外,我注意到一个现象,如果我kill -9 9348
,这两个过程都结束了。但是对于下一个解决方案C,进程9349将被移交给系统init
进程1。
解决方案C):
使用此解决方案,我可以正确运行遥控器tcp_sender
。但是python脚本会被远程程序阻塞,直到它退出。我不希望我的脚本等待远程退出。
log = open('log','a+')
ssh = connect(hostname)
(stdin, stdout, stderr) = ssh.exec_command("[ -f tcp_sender ] && echo 1 || echo 0")
res = stdout.readlines()
print hostname,res[0]
if res[0] == '0\n':
UnusedHostFile.write(hostname+"tcp_sender doesn't exists\n")
else:
chan = ssh.invoke_shell()
chan.send("sudo chmod 777 tcp_sender\n")
chan.send('x=`ps -ef|grep "tcp_sender"|grep -v "grep"|awk \'{print $2}\'`; [ -n "${x}" ] && sudo kill -9 $x\n')
time.sleep(4)
while not chan.recv_ready():
time.sleep(1)
buf = ''
buf +=chan.recv(9999)
print buf
chan.send('sudo ./tcp_sender\n')
#chan.send('sudo whoami\n')
time.sleep(2)
(stdin, stdout, stderr) = ssh.exec_command("ps -ef|grep 'tcp_sender'|grep -v 'grep'|wc -l")
res = stdout.readlines()
while res[0].strip() != '0':
time.sleep(3)
(stdin, stdout, stderr) = ssh.exec_command("ps -ef|grep 'tcp_sender'|grep -v 'grep'|wc -l")
res = stdout.readlines()
print res[0].strip()
while not chan.recv_ready():
time.slepp(1)
buf = ''
buf += chan.recv(9999)
log.write(hostname+': '+''.join(str(elem) for elem in buf)+'\n\n')
log.close()
那么造成这种现象的潜在原因是什么?谁能给点建议?谢谢!