2016-07-27 5 views
2

私はこれを長年取り組んでおり、助けていただければ幸いです。Pythonのサブプロセスを経由してsshingした後で端末がハングアップする

私がここでやろうとしているのは、テストサーバーへのsshとcd ..と、そしてそのフォルダ内のディレクトリのリストをpythonで表示します。 "proc_stdout =" ステップで、この関数は常にハング何らかの理由で

( 'LS; CD .. 111 -p sshのユーザ@サーバー')

def subprocess_cmd(command): 
    process = subprocess.Popen(command,stdout=subprocess.PIPE, shell=True) 
    print "Test 1" 
    proc_stdout = process.communicate()[0].strip() 
    #proc_stdout= process.stdout.readlines() (Gives same outcome as communicate) 
    #proc_stdout= process.stdout.read() (Gives same outcome as communicate) 
    print "Test 2" 
    print proc_stdout 

subprocess_cmd:このコードは、私の最高の試みであります。 "Test 2"を出力したり、ファイルのリストを返したりしません。私はsshコマンドを取り出してもうまく動作します。私は、端末で見ることを期待することは、このようなものであるが、その代わりに、端末がハングし、私はもうそれと対話することはできません。

dredbounds-computer: python file_name.py 
Test 1 
Test 2 
FileA 
FileB 
FileC 

アップデート: 私は、コードを修正し、そしてproc_stdout =プロセスを置きます。 stderr。 communicate()。

dredbounds-computer: python terminal_test.py 
Test 1 
Traceback (most recent call last): 
    File "file_name.py", line 26, in <module> 
    subprocess_cmd('ssh [email protected] -p 111;cd ..;ls') 
    File "terminal_test.py", line 21, in subprocess_cmd 
    proc_stdout= process.stderr. communicate() 
AttributeError: 'NoneType' object has no attribute 'communicate' 

は、誰もが、私はこのコード、またはそれを行うための別の方法を修正することができます方法を知っています:私は、ターミナルで次のエラーを取得しています、これを実行する

def subprocess_cmd(command): 
    process = subprocess.Popen(command,stdout=subprocess.PIPE, shell=True) 
    print "Test 1" 
    proc_stderr= process.stderr. communicate() 
    print "Test 2" 
    print proc_stderr 
    print "Test 3" 

: ここに私の更新されたコードですもの。なぜこれが私にタイプ・エラーを与えないのか分かりません。私がsshコマンドをどのように呼び出すかに問題がありますか?私はターミナルで同じコマンドを手動で入力しました。そしてそれはディレクトリのリストを返すので、理論上はうまくいくはずです。何かアドバイス?

+0

は、プロセスが終了するまで待機して通信(もしあなたが 'ssh'をやっているのなら、これはおそらく" exit "とタイプする) –

+0

私は プロを使ってみましたc_stdout = process.stdout.readlines()およびproc_stdout = process.stdout.read()も同様です。同じ結果。 – dredbound

+0

これは 'stderr'に書き込むことができます。 'communicate'はタプルを返します。サーバーに接続できない場合、stdoutには何も書き込まれていない可能性があります。 – cdarke

答えて

1

ディレクトリの内容を一覧表示するだけの場合は、SSH経由でコマンドを送信できます。

バッシュ:

ssh 192.168.122.24 ls /tmp 

またはあなたがあなたの質問のように "CD" を使用する場合:

ssh 192.168.122.24 "cd /tmp; ls" 

Pythonスクリプトの例:

import subprocess 

HOST = 'server' 
PORT = '111' 
USER = 'user' 
CMD = 'cd /tmp; ls' 

process = subprocess.Popen(['ssh', '{}@{}'.format(USER, HOST), 
          '-p', PORT, CMD], 
          shell=False, 
          stdout=subprocess.PIPE, 
          stderr=subprocess.PIPE) 
result = process.stdout.readlines() 

if not result: 
    err = process.stderr.readlines() 
    print('ERROR: {}'.format(err)) 
else: 
    print(result) 
+0

魅力のように動作します、ありがとう!私はこれを研究し、なぜ私のコードがうまくいかなかったのか理解します。 – dredbound

関連する問題