2017-06-16 133 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