通过Python脚本(pexpect,popen ...)更改用户(su)
问题描述:
我正在运行一个Python脚本user1,并且在此脚本中,我需要将文件移动到我无权访问的文件夹中。该文件夹归用户2。通过Python脚本(pexpect,popen ...)更改用户(su)
我想要做的是:
- 从USER1变化的user2使用su - user2
- 输入密码
- 移动文件
到目前为止,我与POPEN尝试:
p = subprocess.Popen(["su", "-", "user2"])
p.communicate("user2_password")
p.communicate("mv path/to/file other/path/to/file")
它不工作,我需要在shell手动输入密码。
而且我也试图与Pexpect的:
child = pexpect.spawn('su - user2')
child.expect ('Password:')
child.sendline('user2_password')
child.sendline('mv path/to/file other/path/to/file')
脚本运行,但没有任何反应,并运行该脚本后,我仍然USER1。
任何想法,为什么?对于它的价值,这似乎是特定于su
,因为如果我写了一个脚本sudo
它的工作原理(我可以养活密码)。
谢谢你的帮助!你不要指望发送密码后,任何
答
你的命令失败。取决于你的shell等,你会在su成功后得到某种命令提示符。我的提示是这样的:
[email protected]:~$
其实打印该提示包括许多特殊字符来控制tty的输出,所以我只想抓住后面的$:
child = pexpect.spawn('su - klunssi')
child.expect ('Password:')
child.sendline('klunssi')
child.expect('\$')
child.sendline('mv /home/klunssi/foo /home/klunssi/bar')
这个工作,它的举动。
它不会离开我“klunssi”帐户pexpect.spawn()创建子进程和苏那里发生。
如果你有系统的root访问权限,我建议修改的/ etc/sudoers文件并添加密码的须藤,使您的用户1可以运行为user2的命令。这是更为可靠,因为你并不需要在所有Pexpect的,可以只
Popen(["sudo", "-u", "user2", "yourcommand"])
如果这不是一个选项,然后上面Pexpect的应该做的伎俩。
Hannu
'su'和'sudo'是不同的。也许你的'root'密码不同于* User2 * – Ludisposed
的sudo pass,我查过了,它们是一样的! –