我想從我的服務器反向ssh到pi。我已經在服務器和pi端安裝了ssh密鑰。ssh命令不能從bash腳本工作
每當我在終端中輸入以下命令時,我都可以在沒有密碼的情況下登錄到我的服務器。
ssh -R 19999:localhost:22 [email protected]
但是,無論何時我將上述內容包含在bash腳本中並執行它,它都會要求我輸入密碼。這很奇怪。這是爲什麼?誰能幫我這個 ?因爲我想使用子進程方法(從python運行bash腳本)從python腳本運行命令。
我想從我的服務器反向ssh到pi。我已經在服務器和pi端安裝了ssh密鑰。ssh命令不能從bash腳本工作
每當我在終端中輸入以下命令時,我都可以在沒有密碼的情況下登錄到我的服務器。
ssh -R 19999:localhost:22 [email protected]
但是,無論何時我將上述內容包含在bash腳本中並執行它,它都會要求我輸入密碼。這很奇怪。這是爲什麼?誰能幫我這個 ?因爲我想使用子進程方法(從python運行bash腳本)從python腳本運行命令。
在你的bash腳本的頂部,這是獲得所謂的中,源配置文件:你找到一個命令從shell提示符下發出的,當工作
source ~/.bash_profile
高度投機,有時是一個非常糟糕的主意。 – tripleee 2014-09-27 12:41:25
任何時候未能從一些腳本啓動時有Unix(和Linux)下爲什麼會出現這種情況的原因非常有限。
最有可能的是,您的腳本在您的交互式環境中丟失了某些東西。
#!/usr/local/bin/python
proc = subprocess.Popen(cmd, [args], env=os.environ)
...其中os.environ
:以確保您的環境下Python的subprocess.Popen()
運行命令的一種方式下,你開始Python是明確地傳遞一個字典般的環境到Popen()
呼叫,像這樣的環境匹配將會是你的Python進程的環境。當然,您可以創建自己的副本,然後有選擇地修改或刪除鍵/值對,然後將其傳遞給Popen()
。
如果您的命令包含任何要展開的變量,那麼您可能需要使用Popen()
選項來設置shell=True
;這將強制Python啓動一個shell的副本來解釋命令行的內容。當然,這不會受到潛在的攻擊者的侵害。 (換句話說,不要盲目地從不受信任的來源獲取字符串,並嘗試通過您的shell運行它們)。
在這種情況下,在嘗試使用ssh
時,我建議您特別查找任何SSH_AGENT和SSH_AUTHSOCK環境設置。人們通常會配置ssh-agent
,並且在嘗試自動使用隧道,ssh代理和VPN服務時,會忘記它,直到它們咬住它爲止。
在我自己的ssh-agent
處理我用printenv | ssh 'SSH_A[UG]' > ~/.ssh/env; echo "export SSH_AUTH_SOCK SSH_AGENT_PID >> ~/.ssh/env
開始一個新的ssh-agent
會議結束後,保存適當的環境設置(其中,當然,我做的很少 - 我的工作站和筆記本電腦很少結束重新啓動)。然後我的~/.bash_profile
來源文件。 (實際上,它也會執行kill -0 "$SSH_AGENT_PID" || ~/bin/start_ssh_agent.sh
,如有必要,請重新輸入env文件;這只是爲了自動重新啓動代理程序)。
http://www.mtu.net/~engstrom/ssh-agent.php(安全,然而密碼免費SSH)
參考:How to use ssh command in shell script?在python
使用PTY模塊,其是標準庫或的paramiko。 – 2014-09-24 22:21:00