透過 ssh 連線執行指令

透過 ssh 連線執行指令

我想透過 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

相關內容