通過 Java 程序的遠端 SSH 命令
首先我的Linux知識有限!我更像是一個開發人員,隨便管理一些伺服器:-)
因此,我在一個 RHEL5/6(混合)伺服器場上執行,這就是我想做的事情:我在一台主伺服器上有一個 Java 程序,它在一些遠端機器上執行命令。Java 程序正確地將我的命令發送到作業系統 - 可以毫無問題地執行本地命令。我的問題是在遠端伺服器上執行命令:
- 我有 SSH 密鑰,它允許我的主人簡單地獲得奴隸的 root 權限
- 我的命令有效,如果我通過終端直接觸發它(例如
ssh root@192.168.1.1 "cd /opt/bla"
)- 我嘗試了不同的方法,但結果不同——沒有一個是正確的:)
嘗試#1
$ ssh root@192.168.1.1 Pseudo-terminal will not be allocated because stdin is not a terminal. Host key verification failed.
所以,熟悉Google,我讀過關於 tty 應該解決問題但只會導致:
嘗試#2
$ ssh -t -t root@192.168.1.1 tcgetattr: Invalid argument The authenticity of host '192.168.1.1 (192.168.1.1)' can't be established. RSA key fingerprint is <somehex>.
所以我的應用程序在這一點上卡住了,奇怪的是在 Ctrl+C 之後我看到了以下文本:
Are you sure you want to continue connecting (yes/no)? Killed by signal 2.
所以我假設某些東西正在工作,它只是卡在輸入上。但是,我無法找到有關此錯誤的任何結論。某處的一個提示是編輯
/etc/sudoers
和註釋掉(我知道不推薦)# Defaults requiretty
它沒有做任何事情,儘管我不知道是否應該在主伺服器和/或從伺服器上更改此設置,以及是否需要重新啟動或重新啟動守護程序。
我現在的問題是:這會導致任何結果,還是我的嘗試毫無價值?或者有沒有更好的方法在主機上的程序觸發的從機上執行遠端命令?請記住,我不會重新編譯我的核心或做任何復雜的惡作劇,因為我只是缺乏使用 Linux 的經驗。
高度讚賞幫助!
通過使用 Java 庫Jsch解決了我的問題,它是 SSH2 的純 Java 實現。我想,我的環境中的 SSH 設置也搞砸了,所以在我看來,這似乎是更有效的選擇。
我花了 1-2 個小時才讓它工作——很容易實現。
無論如何感謝您的建議。我尤其必須使用該
StrictHostKeyChecking=no
選項(Java 庫中也提供該選項)才能進行連接。優點和缺點:
- (-) Jsch 的文件很糟糕
- **(-)**有一些假設,你需要在第一次使用它時弄清楚。
- **(+)**但是,網際網路上有很多問題和答案,因為很多人都在使用這個庫。
- **(+)**那裡有一些很好的範例,展示了不同的功能是如何工作的——儘管這並不能完全取代一個好的文件。
我有 SSH 密鑰
這些密鑰是否設置在 root 帳戶下?
主機密鑰驗證失敗。
無法確定主機'192.168.1.1(192.168.1.1)‘的真實性。RSA 密鑰指紋是 .
您的程序沒有寫入 known_hosts 文件。您嘗試連接的主機尚未從 java 程序正在使用的帳戶中使用。在使用之前,您需要生成一個有效的 known_hosts 文件。或者,如果您是一個有點信任的人,您可以設置該
StrictHostKeyChecking no
選項。如果它已在該帳戶下使用,那麼環境就會出現問題。您可能需要強烈考慮為 ssh 客戶端設置配置文件並定義密鑰的路徑和 known_host 文件。讓您的 java 程序使用
ssh -f configfile
.