我如何執行任何命令內聯 ssh,就好像我手動輸入但直接輸出到本地機器一樣?
我可以訪問我無法完全控制的遠端伺服器,並且更喜歡讓在該伺服器上執行操作的自動化腳本在本地執行。我發現並非所有使用 ssh 內聯執行的命令的行為都相同。在 cron 作業中執行的範例:
ssh user@remote.ip "mysqldump -u dbuser -p'pass$word' dbname > backup.sql"
上述(以及它的許多變體)返回
mysqldump: Got error: 1045: Access denied for user 'dbuser'@'localhost' (using password: YES) when trying to connect
. 但是我已經通過ssh
伺服器驗證了密碼是否正確,然後手動執行mysqldump -u dbuser -p'pass$word' dbname > backup.sql
,一切正常。另一個例子是執行類似的東西:
ssh user@remote.ip history > history.txt
上面的輸出是空的,但是如果我
ssh
到另一台機器然後手動執行history > history.txt
,輸出是預期的。如果我執行以下操作,一切都會按預期進行:
ssh user@remote.ip ls > ls.txt
我知道我可以
mysqldump
通過省略-p'pass$word'
和使用此處.my.cnf
概述的本地文件來繞過該範例。並且可以在這裡找到專門針對的答案。history
但是我最終仍然會遇到另一個無法按預期工作的命令,即使我在執行內聯並在本地重定向輸出時將它們包含在引號中。就好像 shell 正在讀取附加了不同變數的東西,具體取決於它的訪問方式。
我如何執行任何命令內聯 ssh,就好像我手動輸入但直接輸出到本地機器一樣?
問題是你的報價:
$ word='phrase' $ echo "pass$word" passphrase $ echo "'pass$word'" 'passphrase' $ echo "'pass\$word'" 'pass$word'
強引號不會“保護”弱引號內的變數,因為它們失去了它們的神奇屬性。
一個簡單的解決方案是逃避美元符號,這可能是你在這裡的失敗:
$ ssh user@remote.ip "mysqldump -u dbuser -p'pass\$word' dbname > backup.sql"
另一種是將密碼實際放入變數中:
$ password='pass$word' ssh user@remote.ip "mysqldump -u dbuser -p '$password' dbname > backup.sql"
第三,如果您想將備份帶到本地主機,無論如何是使用 SSH 隧道:
$ ssh -L 3306:localhost:3306 sleep 60 & $ mysqldump -u dbuser -p 'pass$word' -h localhost -P 3306 dbname > backup.sql
此外,您的問題涉及將輸出重定向到本地電腦,但您的命令不這樣做:
$ ssh user@host "echo hello > output" # creates output on remote host $ ssh user@host "echo hello" > output # creates output on local host