SSH 遠程主機上執行本地腳本 向遠程主機傳遞腳本和腳本需要的參數


SSH 遠程主機上執行本地腳本 向遠程主機傳遞腳本和腳本需要的參數
20180820 陳信
參考: https://www.cnblogs.com/sparkdev/p/6842805.html

示例:
預熱服上執行腳本,檢查其他服務器上java進程的堆棧信息(所有腳本和文件均在預熱服上)
[xbzj@ip-10-0-0-200 server-ip]$ cat jvm-stack.sh

!/bin/bash

20180820,Chenxin

cd /home/xbzj/server-bin/server-ip
cat rsync-ip.txt|grep -v "codex.match" > ./rsync-ip-jvm-stack-tmp.txt #這是服務器IP列表信息
cat ./rsync-ip-jvm-stack-tmp.txt |while read line
do
if [ -z "$line" ];then
continue
fi
echo "------ 啟動服務器java堆棧信息檢索 ------"
echo $line |awk '{print $1 " " $3}'
ip=echo "${line}"|awk '{print $3}'
/usr/bin/ssh $ip -p 4399 -o ConnectTimeout=5 < ./jvm-stack-hotsrv.sh #-o ConnectTimeout=5為ssh連接等待5秒超時
echo "------ END ------"
done

[xbzj@ip-10-0-0-200 server-ip]$ cat jvm-stack-hotsrv.sh #相當於在本地執行的腳本內容

!/bin/bash

20180820,Chenxin

javapid=ps axf|grep java|grep -v -E "(grep|logstash)"|awk '{print $1}'
for i in echo $javapid;do
echo "--- 進程號 $i 以下是該進程的詳細信息 ---"
ps $i
echo "--- 進程號 $i 以下是該進程的jmap信息 ---"
jmap -heap $i
done

以下是知識部分(可以不看)
SSH 交互tty 執行需要交互的命令
有時候我們需要遠程執行一些有交互操作的命令。
$ sshnick@xxx.xxx.xxx.xxx "sudo ls /root"
$ sshnick@xxx.xxx.xxx.xxx "top"

這兩條命令雖然提示的失敗原因不同,但它們有一個共同點:都需要與用戶交互(需要 TTY)。所以它們失敗的原因也是相同的:
默認情況下,當你執行不帶命令的 ssh 連接時,會為你分配一個 TTY。因為此時你應該是想要運行一個 shell 會話。
但是當你通過 ssh 在遠程主機上執行命令時,並不會為這個遠程會話分配 TTY。此時 ssh 會立即退出遠程主機,所以需要交互的命令也隨之結束。
ssh 34.238.67.156 -p 4399 "top"
TERM environment variable not set. #報錯

好在我們可以通過 -t 參數顯式的告訴 ssh,我們需要一個 TTY 遠程 shell 進行交互!
添加 -t 參數后,ssh 會保持登錄狀態,直到你退出需要交互的命令。

ssh 34.238.67.156 -p 4399 -t "top"
按"q"退出

作為總結,我們看看 -t 參數的官方解釋:
"Force pseudo-terminal allocation. This can be used to execute arbitrary screen-based programs on a remote machine, which can be very useful, e.g. when implementing menu services. Multiple -t options force tty allocation, even if ssh has no local tty."
好吧,更強悍的是我們居然可以指定多個 -t 參數!

ssh 多行命令 多條命令(將本地腳本傳遞給遠程主機,並在遠程主機上執行傳遞過去的腳本)
遠程執行腳本
對於要完成一些復雜功能的場景,如果是僅僅能執行幾個命令的話,簡直是弱爆了。我們可能需要寫長篇累牘的 shell 腳本去完成某項使命!此時 SSH 依然是不辱使命的好幫手(哈哈,前面的內容僅僅是開胃菜啊!)。
執行本地的腳本
我們在本地創建一個腳本文件 test.sh,內容為:
ls
pwd
然后運行下面的命令:
$ sshnick@xxx.xxx.xxx.xxx < test.sh
通過重定向 stdin,本地的腳本 test.sh 在遠程服務器上被執行。

ssh 遠程 參數傳遞(將本地參數傳遞給遠程主機,並在遠程主機上執行傳遞過去的腳本和參數)
本地服務器上: vim t.sh

!/bin/bash

echo $0
echo $1
要想在這種情況下(遠程執行本地的腳本)執行帶有參數的腳本,需要為 bash 指定 -s 參數:
[xbzj@ip-10-0-0-200 server-ip]$ ssh 34.238.67.156 -p 4399 'bash -s' < ./t.sh 1
bash
1
輸出的是 "bash" 和 "1" 分別對應 $0 和 $1.

執行遠程服務器上的腳本(腳本已經在遠程機器上) 參數可以直接傳遞過去(這個為最常用的方式)
此時在遠程服務器上用戶 nick 的家目錄中有一個腳本 test.sh。文件的內容如下:
ls
pwd
echo $0
echo $1
然后嘗試執行下面的命令:
$ ssh nick@xxx.xxx.xxx.xxx /home/nick/test.sh helloworld
能夠正常輸出變量.最后兩行 "/home/nick/test.sh" 和 "helloworld" 分別對應 $0 和 $1。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM