在 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 用戶端電腦進行通訊。 (我知道這可能會構成可能的安全問題)
可能的解決方案:
答案1
你想使用預計為了這。它可能已經在您的電腦上。它是任何類型的互動式命令列自動化的標準工具。它是一個 Tcl 庫,因此您將在此過程中免費獲得一些 Tcl 技能。謹防;這很容易上癮。
#!/path/to/expect
spawn ssh [email protected] "mysql -u blub"
expect "*ssword:*"
send -- "mypass\r"
interact
答案2
答案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 通道傳輸網路的密碼,且該密碼不會顯示在控制台中。