2009-09-22 56 views
1

我想知道是否有人對此有任何見解。我有一個bash腳本,應該把我的SSH密鑰放到遠程機器上。從here採用,腳本讀取,python shell命令 - 爲什麼它不工作?

#!/usr/bin/sh 
[email protected] 
KEY="$HOME/.ssh/id_rsa.pub" 
KEYCODE=`cat $KEY` 
ssh -q $REMOTEHOST "mkdir ~/.ssh 2>/dev/null; chmod 700 ~/.ssh; echo "$KEYCODE" >> ~/.ssh/authorized_keys; chmod 644 ~/.ssh/authorized_keys" 

這工作。等效Python腳本應該

#!/usr/bin/python 
import os 
os.system('ssh -q %(REMOTEHOST)s "mkdir ~/.ssh 2>/dev/null; chmod 700 ~/.ssh; echo "%(KEYCODE)s" >> ~/.ssh/authorized_keys; chmod 644 ~/.ssh/authorized_keys"' % 
      {'REMOTEHOST':'[email protected]', 
      'KEYCODE':open(os.path.join(os.environ['HOME'], 
             '.ssh/id_rsa.pub'),'r').read()}) 

但在這種情況下,我得到

sh: line 1: >> ~/.ssh/authorized_keys; chmod 644 ~/.ssh/authorized_keys: No 
such file or directory 

我在做什麼錯?我試圖逃避最內部的引號,但同樣的錯誤信息...先謝謝你的迴應。

回答

5

您有一個嚴肅的問題 - 因爲os.system的行爲不符合您的期望 - 同時,您應該認真地重新考慮整體方法。

您正在啓動一個Python解釋器 - 但後來通過os.system告訴Python解釋器啓動一個shell!在現代Python中根本不應該使用os.systemsubprocess是一個完整的替代品)......但是在這種用例中,使用啓動shell實例的任何Python調用都是非常愚蠢的。

現在,就實際而言,直接的問題 - 請看你的引號是如何嵌套的。你會看到你在mkdir之前開始的報價在echo中被關閉,允許你的命令被拆分成你不想要的地方。

下修復了這個緊迫的問題,但仍然是可怕和邪惡的(不必要的啓動子shell,不正確檢查輸出狀態,並應轉換爲使用subprocess.Popen()):

os.system('''ssh -q %(REMOTEHOST)s "mkdir ~/.ssh 2>/dev/null; chmod 700 ~/.ssh; echo '%(KEYCODE)s' >> ~/.ssh/authorized_keys; chmod 644 ~/.ssh/authorized_keys"''' % { 
    'REMOTEHOST':'[email protected]', 
    'KEYCODE':open(os.path.join(os.environ['HOME'], '.ssh/id_rsa.pub'),'r').read() 
}) 
+0

精氨酸!所以它*是*引用的...我想我也可以做'...'...'...'...'...'但是我一時混淆了bash解決方案與兩套嵌套雙引號一起工作的網絡......無論如何,感謝您的誡勉談話。我將閱讀子流程。 – hatmatrix 2009-09-22 06:16:13