2017-06-16 128 views
2

我正在运行一个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它的工作原理(我可以养活密码)。

谢谢你的帮助!你不要指望发送密码后,任何

+0

'su'和'sudo'是不同的。也许你的'root'密码不同于* User2 * – Ludisposed

+0

的sudo pass,我查过了,它们是一样的! –

回答

1

你的命令失败。取决于你的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