在linux命令和Python之间传递密码

时间:2017-03-15 05:18:08

标签: linux python-2.7

我想在Python中使用超级用户权限执行一些Linux命令。

最初我想从用户输入密码,然后将密码存储在变量中,以备将来使用超级用户权限执行Linux命令时使用。

在示例代码之下,我打算做什么:

import os, sys, getpass**

# To input password from user then use this password while execution of Linux commands using superuser privileges.

password = getpass.getpass()
# Before executing below line it'll prompt to enter the password and here i want to use password variable.

os.system("sudo  -s")
# [sudo] password for <username>: # <Password>

成功执行上述命令后,我想以超级用户权限执行其余代码。

注意:我想在执行os.system("sudo -s")命令时使用标准方法(即stdin,stdout,stderr,pipe等)来输入密码。我知道还有其他方法可以解决这个问题。

例如:

import os

password = "my-password"
command = "echo {0} | sudo -s {1}".format(password, "my-command")
os.system(command)

请帮助我,如果我的意图错误,我该怎么办或纠正我。

1 个答案:

答案 0 :(得分:0)

你可以用pexpect:

来做
Python 2.7.12 (default, Nov 19 2016, 06:48:10) 
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import pexpect
>>> terminal = pexpect.spawn('/bin/sh')

启动shell

>>> terminal.sendline('sudo aptitude help')
19

发送命令

>>> terminal.expect('andy:')
0

期望[sudo] password for <user>:或仅<user>:出现在输出中(终端会等待它)

>>> import getpass
>>> password = getpass.getpass()
Password: 

获取密码

>>> terminal.sendline(password)
16

将密码发送到终端

>>> result = ''
>>> while True:
...     try:
...         result += terminal.read_nonblocking(1, 1)
...     except pexpect.TIMEOUT:
...         break
... 

获得结果

>>> result
'\r\naptitude 0.7.4\r\n\xd0\x98\xd1\x81\xd0\xbf\xd0\xbe\xd0\xbb\xd1\x8c\xd0\xb7\xd0\xbe\xd0\xb2\xd0\xb0\xd0\xbd\xd0\xb8\xd0\xb5: aptitude [-S \xd0\xb8\xd0\xbc\xd1\x8f \xd1\x84\xd0\xb0\xd0\xb9\xd0\xbb\xd0\xb0] [-u|-i]\r\n       aptitude [\xd0\xbf\xd0\xb0\xd1\x80\xd0\xb0\xd0\xbc\xd0\xb5\xd1\x82\xd1\x80\xd1\x8b] <\xd0\xb4\xd0\xb5\xd0\xb9\xd1\x81\xd1\x82\xd0\xb2\xd0\xb8\xd0\xb5> \xe2\x80\xa6\r\n  \xd0\x94\xd0\xb5\xd0\xb9\xd1\x81\xd1\x82\xd0\xb2\xd0\xb8\xd1\x8f (\xd0\xb5\xd1\x81\xd0\xbb\xd0\xb8 \xd0\xbd\xd0\xb5 \xd0\xb7\...'

(这是俄语)

Pexpect docs here