Linux

通過 Java 程序的遠端 SSH 命令

  • December 9, 2012

首先我的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.

引用自:https://serverfault.com/questions/450555