others - linux - python脚本如何给sudo发送我的密码

我在python 3.6中编写了一个使用了许多sudo命令的脚本,该脚本以我的用户身份在linux计算机上运行。
我需要一种方法使python在使用sudo时发送我的密码,我一直使用python子进程来运行sudo命令,例如:





cmd = SSH + '-t ' + source +" '" + SUDO +"-k" + LSOF +"-p" + pid +" '"


output = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True, universal_newlines=True)
(out,error) = output.communicate()

这有可能吗?




时间:

我建议你使用Python的pexpect模块执行这个操作,它基于“expect”,并用于自动与其他程序进行交互。它不是python标准库的一部分,但是如果你创建了自己的python环境,则不需要root 。

例如:


#import the pexpect module


import pexpect


# here you issue the command with"sudo"


child = pexpect.spawn('sudo /usr/sbin/lsof')


# it will prompt something like:"[sudo] password for < generic_user >:"


# you"expect" to receive a string containing keyword"password"


child.expect('password')


# if it's found, send the password


child.sendline('S3crEt.P4Ss')


# read the output


print(child.read())


# the end



更多详细信息可以在以下位置找到:

https://pexpect.readthedocs.io/en/stable/api/index.html

希望有帮助!

因为你希望给python脚本提供sudo密码,所以我认为可以创建新的用户组并将该组设置为脚本,你的脚本不再需要sudo密码(仍有sudo权限)。

注:(我的答案在Ubuntu 14.04上测试过,其它Linux版本应该相同。 )

如果以root用户身份登录,则可以键入以下命令创建新用户:


adduser <newuser>



或者


sudo adduser <newuser>



如果需要新用户能够使用root (管理)特权执行命令,则需要给新用户sudo权限:

可以通过使用visudo命令来执行这个操作,该命令在编辑器中打开适当的配置文件,

 
visudo



 

或者

 
sudo visudo



 

搜索如下所示的行:


root ALL=(ALL:ALL) ALL



在此行下面,复制你在此处看到的格式,仅更改单词“ root”以引用你想要向它赋予sudo特权的新用户:


root ALL=(ALL:ALL) ALL


<newuser> ALL=(ALL) NOPASSWD:ALL



使用chown更改python脚本的所有权。


sudo chown <newuser>: <python script>



在没有密码的情况下,你可以在sudo权限下运行脚本。

注意:(我建议你这样做,因为你希望将你的sudo密码放入源代码)

我认为你应该使用Paramiko库来做到这一点,确保在导入之前安装paramiko ,查看这里

下面是例子代码,


$pip install paramiko



import paramiko


ssh_client = paramiko.SSHClient()


ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())


pid = 12345 # Modify this per your requirement


try:


 ssh_client.connect('source',username='user',password='pwd')


 stdin,stdout,stderr = ssh_client.exec_command('sudo -k lsof -p '+pid)


 stdin.write('pwdn')


 stdin.flush()


 result = stdout.read.splitlines()


except paramiko.SSHException:


 print('Connection Failed')


 quit()



我花了几个小时来找出如何用子进程来完成它。


import getpass


import subprocess



sudo_password = getpass.getpass(prompt='sudo password: ')


p = subprocess.Popen(['sudo', '-S', 'ls'], stderr=subprocess.PIPE, stdout=subprocess.PIPE, stdin=subprocess.PIPE)



try:


 out, err = p.communicate(input=(sudo_password+'n').encode(),timeout=5)



except subprocess.TimeoutExpired:


 p.kill()



...