2016-07-28 10 views
0

ここでは私のコードです:Pythonのサブプロセスにsudoが返すエラー:ERROR:[ 'sudoを:申し訳ありませんが、あなたはsudoのを n実行するための端末を持っている必要があります']

import subprocess 

HOST = 'host_name' 
PORT = '111' 
USER = 'user_name' 
CMD = 'sudo su - ec2-user; 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: 
    print "Im an error" 
    err = process.stderr.readlines() 
    print('ERROR: {}'.format(err)) 
else: 
    print "I'm a success" 
    print(result) 

私はこれを実行すると、私は次のような出力を受け取ります私のターミナルで:

dredbounds-computer: documents$ python terminal_test.py 
Im an error 
ERROR: ['sudo: sorry, you must have a tty to run sudo\n'] 

私は複数のものを試してみたが、私はそのエラー得続ける「sudoを:申し訳ありませんが、あなたはsudoを実行するための端末を持っている必要があります」。手動で端末を操作するとうまく動作しますが、これを自動化する必要があります。私の回避策は、ssh呼び出しで '-t'または '-tt'を使用することであるかもしれませんが、サブプロセスでこれを正常に実装することはできませんでした(端末はただ私のためにハングアップしています)。コードを修正する方法や、この問題を回避する方法については、誰でも知っていますか?理想的にはsshを使い、sudoユーザーに切り替えてそこからファイルを実行したい(私はテスト目的のためにlsを入れるだけです)。

+0

なぜ 'sudoのSU - EC2ユーザー。 'sudo -u ec2-user ls'の代わりに' ls'を使用していますか? – miken32

答えて

1

sudoはパスワードの入力を求めていますが、パスワードを入力する必要があります。 -tまたは-ttを渡すと、リモートコマンドを実行する端末が提供されますが、パスワードの入力を待っています。

process = subprocess.Popen(['ssh','-tt', '{}@{}'.format(USER, HOST), 
          '-p', PORT, CMD], 
          shell=False, 
          stdout=subprocess.PIPE, 
          stderr=subprocess.PIPE, 
          stdin=subprocess.PIPE) 
process.stdin.write("password\r\n") 

lsが後までsu終了によって開始されたシェルを実行していないこと、しかし、覚えておいてください。可能であればec2-userとしてマシンにログインするか、suを最初に通過させずに、任意のコマンドを実行するためにsudoを使用するかのいずれかを行う必要があります。

+0

返事をありがとう。私はあなたが示唆したようにprocess.stdin.write( "password")を使ってみましたが、私は取得しています: "AttributeError: 'NoneType'オブジェクトに属性 'write'" を実行しました。 – dredbound

+0

'stdin = subprocess.PIPE'を引数として渡しましたか? – chepner

+0

それを逃しましたが、今はコンソールからの私の元の出力に戻ってきます。 "エラー:['sudo:sudoを実行するには、申し訳ありません。\ n'] – dredbound

0

パスワードを要求しないでsudoを動作させることができます。これをリモートサーバーの/etc/sudoersに追加してください。host_name

user ALL = (ec2-user) NOPASSWD: ls 

これはuserという名前のユーザーがパスワードを入力せずにec2-userとしてコマンドlsを実行することができます。

これはあなたが私に、より合理的なようである、このように見えるためにあなたのコマンドを変更する前提としています

CMD = 'sudo -u ec2-user ls' 
関連する問題