19

私が試したこと:

  1. invoke_shell()その後channel.send su、パスワードを送信すると、ルートではなくなりました
  2. invoke_shell()その後channel.exec_command、「チャネル閉鎖」エラーが発生しました
  3. _transport.open_session()その後channel.exec_command、ルートにならないという結果になりました
  4. invoke_shell()その後、stdin に書き込み、それをフラッシュすると、root ではなくなりました
4

7 に答える 7

28

この例をチェックしてください:

ssh.connect('127.0.0.1', username='jesse', 
    password='lol')
stdin, stdout, stderr = ssh.exec_command(
    "sudo dmesg")
stdin.write('lol\n')
stdin.flush()
data = stdout.read.splitlines()
for line in data:
    if line.split(':')[0] == 'AirPort':
        print line

詳細な説明が記載された例: http://jessenoller.com/2009/02/05/ssh-programming-with-paramiko-completely-different/

それが役に立てば幸い!

于 2011-06-07T20:57:24.760 に答える
2

channel を使用して sudo パスワードを送信できます。

  passwd = getpass.getpass()
  ssh = paramiko.client.SSHClient()
  ssh.set_missing_host_key_policy(paramiko.client.AutoAddPolicy())
  ssh.load_system_host_keys()
  ssh.connect(host, allow_agent=True)
  chan = ssh.get_transport().open_session()
  chan.get_pty()
  chan.setblocking(1)

  chan.exec_command("sudo -k dmesg")

  while chan.recv_ready()==False:
      stdout=chan.recv(4096)
      if re.search('[Pp]assword', stdout):
          chan.send(passwd+'\n')
      time.sleep(1)
      
  while chan.recv_ready():
      stdout += chan.recv(20000)
  chan.close()
  ssh.close()
于 2016-11-24T10:59:14.617 に答える
2

申し訳ありませんが、詳細な回答をする時間がありませんが、このアドバイスを使用してparamikoにsudoコマンドを実装できました

import paramiko
l_password = "yourpassword"
l_host = "yourhost"
l_user = "yourusername"
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(l_host, username=l_user, password=l_password)    
transport = ssh.get_transport()
session = transport.open_session()
session.set_combine_stderr(True)
session.get_pty()
#for testing purposes we want to force sudo to always to ask for password. because of that we use "-k" key
session.exec_command("sudo -k dmesg")
stdin = session.makefile('wb', -1)
stdout = session.makefile('rb', -1)
#you have to check if you really need to send password here 
stdin.write(l_password +'\n')
stdin.flush()
for line in stdout.read().splitlines():        
    print 'host: %s: %s' % (l_host, line)
于 2015-01-18T16:15:47.993 に答える
0

私の考えでは、sudoer 権限を持つスクリプトを作成する方がはるかに簡単で安全です。

たとえば、これを sudoers に追加します。

myuser  ALL=NOPASSWD:/home/myuser/somescript.sh

これで、ホスト マシンで paramiko を介してスクリプトを呼び出すだけで完了です。

于 2011-06-07T21:04:11.427 に答える