我正在尝试使用python-paramiko在远程计算机上执行sudo命令,当我执行命令时,我用3个流绑定它,我使用输入流来传递密码,但它不起作用,这是追溯结果:
Traceback (most recent call last): File "", line 1, inFile "/usr/local/lib/python2.7/dist-packages/paramiko/file.py", line 314, in write self._write_all(data) File "/usr/local/lib/python2.7/dist-packages/paramiko/file.py", line 439, in _write_all count = self._write(data) File "/usr/local/lib/python2.7/dist-packages/paramiko/channel.py", line 1263,in _write self.channel.sendall(data) File "/usr/local/lib/python2.7/dist-packages/paramiko/channel.py", line 796, in sendall raise socket.error('Socket is closed') error: Socket is closed
这是我的python代码:
import paramiko ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect('192.168.0.104', username='cdc',password='123456') stdin, stdout, stderr = ssh.exec_command("sudo dmesg") stdin.write("123456\n") stdin.flush() print stdout.readlines() ssh.close()
有帮助吗?提前致谢
首先,你有没有试过在控制台ssh cdc@192.168.0.104 "sudo -S -p '' dmesg"
.如果它也失败,那么您可以检查sshd
设置和sudoer
设置.
如果它运行良好,请在行之间添加一些回声,以便我们可以确切地知道何时抛出异常.我高度怀疑,你应该改变sudo dmesg
对sudo -S -p '' dmesg
.
您也可以尝试我的paramiko包装.我可以顺利地使用它来访问任何CentOS/SuSE节点并执行任何命令(w/wo sudo特权):
#!/usr/bin/python from StringIO import StringIO import paramiko class SshClient: "A wrapper of paramiko.SSHClient" TIMEOUT = 4 def __init__(self, host, port, username, password, key=None, passphrase=None): self.username = username self.password = password self.client = paramiko.SSHClient() self.client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) if key is not None: key = paramiko.RSAKey.from_private_key(StringIO(key), password=passphrase) self.client.connect(host, port, username=username, password=password, pkey=key, timeout=self.TIMEOUT) def close(self): if self.client is not None: self.client.close() self.client = None def execute(self, command, sudo=False): feed_password = False if sudo and self.username != "root": command = "sudo -S -p '' %s" % command feed_password = self.password is not None and len(self.password) > 0 stdin, stdout, stderr = self.client.exec_command(command) if feed_password: stdin.write(self.password + "\n") stdin.flush() return {'out': stdout.readlines(), 'err': stderr.readlines(), 'retval': stdout.channel.recv_exit_status()} if __name__ == "__main__": client = SshClient(host='host', port=22, username='username', password='password') try: ret = client.execute('dmesg', sudo=True) print " ".join(ret["out"]), " E ".join(ret["err"]), ret["retval"] finally: client.close()
对不起,我没有时间详细解答,但我能够使用这个建议在paramiko上实现sudo命令
#!/usr/bin/env python 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)