2014-09-24 84 views
-1

我想從我的服務器反向ssh到pi。我已經在服務器和pi端安裝了ssh密鑰。ssh命令不能從bash腳本工作

每當我在終端中輸入以下命令時,我都可以在沒有密碼的情況下登錄到我的服務器。

ssh -R 19999:localhost:22 [email protected] 

但是,無論何時我將上述內容包含在bash腳本中並執行它,它都會要求我輸入密碼。這很奇怪。這是爲什麼?誰能幫我這個 ?因爲我想使用子進程方法(從python運行bash腳本)從python腳本運行命令。

+0

使用PTY模塊,其是標準庫或的paramiko。 – 2014-09-24 22:21:00

回答

0

在你的bash腳本的頂部,這是獲得所謂的中,源配置文件:你找到一個命令從shell提示符下發出的,當工作

source ~/.bash_profile 
+0

高度投機,有時是一個非常糟糕的主意。 – tripleee 2014-09-27 12:41:25

1

任何時候未能從一些腳本啓動時有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文件;這只是爲了自動重新啓動代理程序)。