一般ubuntu新装系统执行sudo指令时,都是默认需要密码的,想改成免密执行,可以参照下述方法设置:
- sudo visudo
-
- ##找到%sudo ALL=(ALL:ALL) ALL 改为:
- %sudo ALL=(ALL:ALL) NOPASSWD:ALL
-
- ##根据提示保存退出即可
但远程主机往往是新机或者默认配置,使用paramiko库SSHClient的exec_command远程执行sudo指令时,指令并不能执行成功,查看stdout.read()中无异常,stderr.read()中返回“sudo: no tty present and no askpass program specified\n”的错误打印。
解决办法有两个:
1.sudo指令中带-S执行,并使用stdin输入密码
- import paramiko
- username='tester'
- passwd='1'
-
- ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy) # 设置允许连接陌生主机
- ssh = paramiko.SSHClient() # 实例一个连接对象
- ssh.connect('127.0.0.1', 22, username, passwd, timeout=5) # 连接被管理机
-
- cmd = "sudo -S echo '123' > testsudo.txt"
- stdio, stdout, stderr = self.ssh.exec_command(cmd)
- stdio.write("%s\n"%passwd)
- stdin.flush()
-
- print(stdout.read().decode())
- print(stderr.read().decode())
2.在执行exec_command时带上get_pty=True
- import paramiko
- username='tester'
- passwd='1'
-
- ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy) # 设置允许连接陌生主机
- ssh = paramiko.SSHClient() # 实例一个连接对象
- ssh.connect('127.0.0.1', 22, username, passwd, timeout=5) # 连接被管理机
-
- cmd = "sudo echo '123' > testsudo.txt"
- stdio, stdout, stderr = self.ssh.exec_command(cmd, get_pty=True)
- stdio.write("%s\n"%passwd)
- stdin.flush()
-
- print(stdout.read().decode())
- print(stderr.read().decode())