OpenSSH scp
ユーティリティは ssh
を呼び出します リモート ホストへの SSH 接続を確立するプログラムと、ssh プロセスが認証を処理します。 ssh
utility は、コマンド ラインまたはその標準入力でパスワードを受け入れません。これは OpenSSH 開発者側の意図的な決定だと思います。なぜなら、人々は鍵ベースの認証のようなより安全なメカニズムを使用すべきだと感じているからです。 ssh を呼び出すためのソリューションは、次のいずれかのアプローチに従います:
ssh
を取得する ここまたはここ、またはここの回答のいくつかで説明されている別のコマンドを呼び出して、パスワードを取得します。ssh
の修正バージョンをビルドします。 思い通りに機能します。
この特定のケースでは、すでに scp
を呼び出していることを考えると、 Python スクリプトから、これらの 1 つが最も合理的なアプローチのようです:
scp
を呼び出します。 それにパスワードを入力してください。
ssh
への関数は次のとおりです。 pexpect
を使用したパスワード :
import pexpect
import tempfile
def ssh(host, cmd, user, password, timeout=30, bg_run=False):
"""SSH'es to a host using the supplied credentials and executes a command.
Throws an exception if the command doesn't return 0.
bgrun: run command in the background"""
fname = tempfile.mktemp()
fout = open(fname, 'w')
options = '-q -oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/null -oPubkeyAuthentication=no'
if bg_run:
options += ' -f'
ssh_cmd = 'ssh %[email protected]%s %s "%s"' % (user, host, options, cmd)
child = pexpect.spawn(ssh_cmd, timeout=timeout) #spawnu for Python 3
child.expect(['[pP]assword: '])
child.sendline(password)
child.logfile = fout
child.expect(pexpect.EOF)
child.close()
fout.close()
fin = open(fname, 'r')
stdout = fin.read()
fin.close()
if 0 != child.exitstatus:
raise Exception(stdout)
return stdout
scp
を使用して同様のことが可能になるはずです .
リンクした2番目の回答は、Pexpectを使用することを示唆しています(これは通常、入力を必要とするコマンドラインプログラムと対話するための正しい方法です)。使用できる python3 で動作するフォークがあります。