我想透過 ssh 連線執行以下命令:
tmpValue=$(cat /var/run/jboss-as/jboss-as-standalone8.pid) && top -b -U jboss -n 1 |grep $tmpValue |awk '{print $9}'
該命令正在我的目標機器上運行。
現在我想從另一台機器使用這個命令並通過 ssh 執行它,所以我所做的是這樣的:
ssh jboss@myTargetServer tmpValue=$(cat /var/run/jboss-as/jboss-as-standalone8.pid) && top -b -U jboss -n 1 |grep $tmpValue |awk '{print $9}'
結果是
cat: /var/run/jboss-as/jboss-as-standalone8.pid: No such file or directory
Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.
我的電話有什麼問題嗎?
答案1
簡化命令可能會更容易,這樣 shell 可能會遇到更少的特殊字元:
ssh jboss@myTargetServer 'ps -p $(cat /var/run/jboss-as/jboss-as-standalone8.pid) -o %cpu= 2>/dev/null'
2>/dev/null
如果無法找到 PID 檔案或包含過時的 PID,則尾隨會丟棄錯誤文字。
答案2
我建議將這些命令放入您可以使用ssh
.否則,您需要將命令列的整個「遠端」部分放入引號中,並正確轉義其中的所有內容。這可能很乏味並且容易出錯。這就是遠端腳本呼叫的原因。
答案3
$()
第二個指令在本機子 shell 中執行程式碼部分 ( )。您需要透過轉義特殊字元(基本上$
)使其在另一端運行:
ssh jboss@myTargetServer tmpValue=\$(cat /var/run/jboss-as/jboss-as-standalone8.pid) \
&& top -b -U jboss -n 1 |grep \$tmpValue |awk '{print $9}'
或將其全部放入撇號中'
並轉義內部的:
ssh jboss@myTargetServer 'tmpValue=$(cat /var/run/jboss-as/jboss-as-standalone8.pid) \
&& top -b -U jboss -n 1 |grep \$tmpValue |awk \'{print $9}\''
我沒有測試它,但這是應該採取哪些措施來修復它的基本想法。
答案4
如果您真的不願意編寫腳本,您可能會發現
這裡的文檔便利。簡而言之,您可以新增<< SOMETEXMARKER
到行尾並繼續為遠端主機輸入任意數量的命令。然後,在最後一行(在該行的最開始)輸入相同的內容SOMETEXTMARKER
,這使得輸入的命令被遠端執行
這是一個範例
[bobby@bobby ~]$ ssh jimmy@jimmy << MRK '
> # single quote above makes all vars resolve on remote host
> echo remote user and host are :
> echo $USER $(hostname)
> # entereing closing single quote
> '
> # finally entereing the marker
> MRK
remote user and host are :
jimmy jimmy