22

私はpythonが初めてです。ホストに接続して 1 つのコマンドを実行するスクリプトを作成しました

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host, username=user, password=pw)

print 'running remote command'

stdin, stdout, stderr = ssh.exec_command(command)
stdin.close()

for line in stdout.read().splitlines():
    print '%s$: %s' % (host, line)
    if outfile != None:
        f_outfile.write("%s\n" %line)

for line in stderr.read().splitlines():
    print '%s$: %s' % (host, line + "\n")
    if outfile != None:
        f_outfile.write("%s\n" %line)

ssh.close()

if outfile != None:
    f_outfile.close()

print 'connection to %s closed' %host

except:
   e = sys.exc_info()[1]
   print '%s' %e

リモートコマンドがttyを必要としない場合、正常に動作します。Paramiko を使用した invoke_shell の例の入れ子になった SSH セッションが見つかりました。サーバーにスクリプトで指定されていないプロンプトがある場合->無限ループまたはスクリプトで指定されたプロンプトが戻りテキストの文字列であるため、このソリューションには満足していません->すべてのデータが受信されるわけではありません. 私のスクリプトのように stdout と stderr が送り返されるより良い解決策はありますか?

4

5 に答える 5

34

受け入れられた回答に何か問題があります。時々 (ランダムに) サーバーからクリップされた応答が返されます。このコードは私にとって完璧に機能したため、受け入れられた回答の誤った原因を調査しませんでした。

import paramiko

ip='server ip'
port=22
username='username'
password='password'

cmd='some useful command' 

ssh=paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(ip,port,username,password)

stdin,stdout,stderr=ssh.exec_command(cmd)
outlines=stdout.readlines()
resp=''.join(outlines)
print(resp)

stdin,stdout,stderr=ssh.exec_command('some really useful command')
outlines=stdout.readlines()
resp=''.join(outlines)
print(resp)
于 2016-06-01T22:30:42.313 に答える
26

http://docs.paramiko.org/en/stable/index.htmlで見つけることができる広範なparamikoAPIドキュメントがあります

パスワードで保護されたクライアントでコマンドを実行するには、次の方法を使用します。

import paramiko

nbytes = 4096
hostname = 'hostname'
port = 22
username = 'username' 
password = 'password'
command = 'ls'

client = paramiko.Transport((hostname, port))
client.connect(username=username, password=password)

stdout_data = []
stderr_data = []
session = client.open_channel(kind='session')
session.exec_command(command)
while True:
    if session.recv_ready():
        stdout_data.append(session.recv(nbytes))
    if session.recv_stderr_ready():
        stderr_data.append(session.recv_stderr(nbytes))
    if session.exit_status_ready():
        break

print 'exit status: ', session.recv_exit_status()
print ''.join(stdout_data)
print ''.join(stderr_data)

session.close()
client.close()
于 2012-05-25T17:04:50.193 に答える
0

パスワードなしの SSH が機能しました

import paramiko

def connect_SSH():
    ssh = paramiko.SSHClient()
    username = '<uname>'
    port = <port-no>
    ip = '<ip-address>'
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(ip,port,username)

    stdin, stdout, stderr = ssh.exec_command('<cmd>')
    outlines = stdout.readlines()
    resp=''.join(outlines)
    print(resp) 
connect_SSH()
于 2021-12-02T06:13:09.613 に答える