2016-04-14 12 views
2

私は引数としてユーザー名とパスワードを与えられた、Linuxユーザーを作成するpythonスクリプトを持っています。私は のpython(例えば、subprocess.Popen('/pass.py'))から同じVM上で直接SSH経由でPythonスクリプトの引数としてパスワードを渡す方法は?

  • コールスクリプト(例えば、./pass.py
  • コールスクリプト
  • に 上のpythonから別のVMからスクリプトを呼び出したいですSSH。 (例えば、subprocess.Popen(['ssh', 'host', 'pass.py')

TL; DRは、最終的なコードsnippitを確認し、最初の場合の

getpass作品を問います。

password = getpass.getpass() 

私は、SSH、(ssh myhost /path/to/script.py username)上でこれを実行する場合しかし、私は次のような出力が得られます。また

/usr/lib64/python2.6/getpass.py:83: GetPassWarning: Can not control echo on the terminal. 
    passwd = fallback_getpass(prompt, stream) 
Warning: Password input may be echoed. 
Password: password123 

、私はsubprocessを使用してpythonでこのスクリプトを実行する場合:

# Running from same host 
proc = subprocess.Popen(['./pass.py'], stdin=subprocess.PIPE) 
# Running from different host 
proc = subprocess.Popen(['ssh', 'myhost', '/path/to/pass.py', 'username'], stdin=subprocess.PIPE) 

subprocess.Popenの周囲にハングしているようで、パスワードを受け付けません。

しかし、私がgetpass.getpass()を取り除いてraw_inputに置き換えると、ケース2と3で動作します。パスワードをエコーし​​ません。

従って私は、引数として--scriptを取り、raw_input経由でパスワードを要求され、代わりに次のことを考えています:

import sys, getpass, argparse 
parser = argparse.ArgumentParser() 
parser.add_argument("username") 
parser.add_argument("-s", "--script", action="store_true") 
args = parser.parse_args() 
username = args.username 
if args.script: 
    password = raw_input("Password: ") 
else: 
    password = getpass.getpass() 

これは私の例すべての3つを満たすとパスワードをエコーされていないよう。

これは安全でパスワードが記録されないと仮定して正しいですか?

答えて

0

SSHセッション中に-tを追加すると、エコーフリー端末が強制的に実行されます。あなたのクライアントの場合:

#!/usr/bin/env python 

import subprocess 

subprocess.call(["ssh", "-t", remote_host, "./add_user.py", "test_user"]) 

その後、リモートパスワードは、サーバー上のGETPASS使用することができるはずです。直接呼び出すことも、別のスクリプトを呼び出すこともできます。

#!/usr/bin/env python 

import getpass, argparse 

parser = argparse.ArgumentParser() 
parser.add_argument("username") 
args = parser.parse_args() 
username = args.username 
password = getpass.getpass() 
関連する問題