ssh 中類似 Bash 的命令替換或如何從 ssh *客戶端* 請求內容?

ssh 中類似 Bash 的命令替換或如何從 ssh *客戶端* 請求內容?

在 bash(和其他 shell)中,可以使用 $() 和 ``(反引號)之類的東西將命令的結果插入到命令列中。

現在,如果您有類似的東西,但對於 ssh 會話,那就太好了。因此,您處於 ssh 會話中,需要來自您自己的計算機的一些信息,並希望將其放入您所連接的計算機上的內部命令行中。

例如,假設您想要直接存取 mysql 控制台。你可以使用這樣的指令:

ssh [email protected] "mysql -u blub -pmypass"

這可行,但問題是,您可以在 ssh shell 進程的命令列中看到密碼。

為了解決這個安全問題,我想要這樣的東西:

ssh [email protected] "mysql -u blub -p\$(ssh-on-client 'cat pass-file')"

它將cat passfile在 ssh 客戶端而不是伺服器上執行。有這樣的事情嗎?您還有其他技巧嗎?

更新:我很欣賞參考我的例子的答案,但除非他們回答真正的問題,否則我不會接受它們。也就是說,是否可以從 ssh 會話內與 ssh 用戶端電腦進行通訊。 (我知道這可能會構成可能的安全問題)

可能的解決方案:

  • 在客戶端上有一個 ssh 伺服器可以連接回。 (sweimann) 問題是如何取得連接回伺服器的憑證。
  • 使用 ssh 建立隧道並使用一些 netcat 腳本/telnet 在伺服器上執行命令並將結果發回。
  • 使用expect 編寫shell 腳本。 (扎克湯普森)
  • 在用戶端上使用 ssh 的自訂包裝器來監視控制台並採取相應的操作。 (札幌)
  • 修補 SSH 以支援此功能。郵件列表上有類似的補丁可用的
  • 有一個選項“SendEnv”SSH它在遠端電腦上設定環境變數。不過,必須在遠端 sshd 上啟用此功能。

答案1

你想使用預計為了這。它可能已經在您的電腦上。它是任何類型的互動式命令列自動化的標準工具。它是一個 Tcl 庫,因此您將在此過程中免費獲得一些 Tcl 技能。謹防;這很容易上癮。

#!/path/to/expect
spawn ssh [email protected] "mysql -u blub"
expect "*ssword:*"
send -- "mypass\r"
interact

答案2

嘗試使用 <.

SSH[電子郵件受保護]“mysql -u blub -p”< 文件

如果「檔案」中的第一行是您的密碼,它「應該」將其用於密碼提示,然後其餘部分將用於 sql 部分。

如果您只是在遠端伺服器上執行 sql 文件,請嘗試:

SSH[電子郵件受保護]“mysql -u blub -p < 文件.sql” < 密碼

答案3

幾年前我一直在研究根本問題。我想從 SSH 會話內部觸發 SCP 下載。與您的問題一樣,這需要從 SSH 會話內部通訊回客戶端上的某個進程。

因此,這是第三種可能的解決方案:使用 SSH 的包裝器進行連接,它會掃描 SSH 的輸出,並在識別到模式時在本地觸發某些命令。這顯然是一個黑客行為,但它可能會起作用。

我最終得到了 /usr/bin/script 的修改版本,它會記住我的 SSH 連接(例如me@somehost),每當我的 ssh 會話列印時###/some/absulte/path/to/file/on/host.txt###,它都會在本地執行scp me@somehost:/some/absulte/path/to/file/on/host.txt .

使用一個簡單的 shell 腳本可以輕鬆地在伺服器上產生模式和絕對路徑。

(我的程式碼實際上做了更多的事情:它在下載的檔案上打開一個本地文字編輯器,並在文件修改時使用 SCP 重新上傳它。如果您需要程式碼,請告訴我。)

從那時起我一直在尋找更好的實現方式,但到目前為止我還沒有找到。

也許這項技術可以作為 SSH 代理命令(想想 connect.c)來實現,而不是 SSH 的包裝器。

答案4

您必須模擬終端會話:

ssh -t [email protected] "mysql -u blub -p"

在這種情況下,系統會要求您輸入透過加密 ssh 通道傳輸網路的密碼,且該密碼不會顯示在控制台中。

相關內容