1

クライアントにsshしてクライアントからbashを実行することになっているpythonスクリプトがあります。テスト シナリオとして、接続に 1 台のマシンのみを使用していますが、目的は複数のクライアントに接続し、それらのマシンから bash スクリプトを実行することです。

私のPythonコード:

 import os 
 import subprocess
 import time


def ssh_login_execute():
    if device['PWD'] != "":
            run=('sshpass -p %s ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -t -p %s %s@%s' % (device['PWD'], device['PORT'], device['USER'], device['IP']))
    else:
            run=('ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -t -p %s %s@%s' % (device['PORT'], device['USER'], device['IP']))

    cmd = ('cd %s' % (script_path))

    run2=run.split()
    run2.append(cmd)
    t=subprocess.Popen(run2, stdout=subprocess.PIPE, stderr=open(os.devnull, 'w'))
    print "I am in 192.168.1.97"
    execute_tg()
    return t

def execute_tg():
   path = "/home/"
   os.chdir(path)
   print os.getcwd()
   cmd=("sh my_script.sh")
   t=subprocess.Popen(cmd.split(), stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

if __name__ == "__main__":
    device = {}
    device['PORT']=22
    device['PWD']= "abcd"
    device['USER']= "root"
    device['IP']= "192.168.1.97"
    script_path= "/home/"
    ssh_login_execute()

コード「python script.py」を実行すると、次のような出力が表示されます。

  I am in 192.168.1.97
  /home/
  Output is sh: 0: Can't open my_script.sh

「my_script.sh」は192.168.1.97の/homeディレクトリにありますが。この問題を解決すると同時に、複数のクライアントに ssh して bash を実行できるように拡張するにはどうすればよいですか。

4

4 に答える 4

0

実際、sshpass は ssh コマンド/接続を一度に実行します。subprocess.Popen() を介してリモート クエリが実行されると、次の行でプログラム コントロールがローカル マシンに戻ります。また、スクリプトはリモート マシン上にあるのにローカル マシン上にないため、プログラムは「my_script.sh を開けません」というエラーを表示します。

私の提案は、単一のプログラム変数(あなたの場合は「run2」変数)で実行するものを使用して完全な sshpass コマンドを作成し、それを一度に subprocess.Popen() に渡すことです。変更されたコードは次のとおりです。

import os 
import subprocess
import time

def ssh_login_execute():
    if device['PWD'] != "":
        run=('sshpass -p %s ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -t -p %s %s@%s' % (device['PWD'], device['PORT'], device['USER'], device['IP']))
    else:
        run=('ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -t -p %s %s@%s' % (device['PORT'], device['USER'], device['IP']))

    cmd = ('sh /%s/%s' % (script_path,'my_script.sh'))

    run2=run.split()
    run2.append(cmd)
    t=subprocess.Popen(run2, stdout=subprocess.PIPE, stderr=open(os.devnull, 'w'))
    print "I am in 192.168.1.97" # HERE YOU ASSUMED THAT YOU ARE IN REMOTE MACHINE BUT ACTUALLY YOU ARE IN LOCAL MACHINE ONLY
    return t

if __name__ == "__main__":
    device = {}
    device['PORT']=22
    device['PWD']= "abcd"
    device['USER']= "root"
    device['IP']= "192.168.1.97"
    script_path= "/home/"
    ssh_login_execute()
于 2015-09-23T10:30:24.313 に答える
0

あなたの「ホーム」ディレクトリは通常、/home/<username>またはおそらくのようなもの/users/<username>です。通常、シェルは~ホーム ディレクトリへのパスの同義語として受け入れます。これは代わりに機能しますか:

cmd=("sh ~/my_script.sh")
于 2013-09-19T17:52:28.670 に答える