一般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"
stdin, stdout, stderr = self.ssh.exec_command(cmd)
stdin.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"
stdin, stdout, stderr = self.ssh.exec_command(cmd, get_pty=True)
stdin.write("%s\n"%passwd)
stdin.flush()
print(stdout.read().decode())
print(stderr.read().decode())