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
この 2 つのプロセスがすべて終了するという現象に気付きました。init
ただし、次のソリューション C では、プロセス 9349 がシステムプロセス 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()
では、この現象の潜在的な理由は何ですか? 誰かアドバイスをいただけますか?ありがとう!