ssh執行遠程操作
命令格式
ssh -p $port $user@$p 'cmd'
$port : ssh連接端口號
$user: ssh連接用戶名
$ip:ssh連接的ip地址
cmd:遠程服務器需要執行的操作
準備工作
基於公私鑰認證或者用戶名密碼認證能確保登錄到遠程local2服務器(有點基本運維知識的人做這個事情都不是問題)
cmd如果是腳本,注意絕對路徑問題(相對路徑在遠程執行時就是坑)
不足
這個命令可以滿足我們大多數的需求,但是通常運維部署很多東西的時候需要root權限,但是有幾處限制:
遠程服務器local2禁止root用戶登錄
在遠程服務器腳本里轉換身份用expect需要send密碼,這樣不夠安全
ssh的-t參數
-t Force pseudo-tty 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.
中文翻譯一下:就是可以提供一個遠程服務器的虛擬tty終端,加上這個參數我們就可以在遠程服務器的虛擬終端上輸入自己的提權密碼了,非常安全
命令格式
ssh -t -p $port $user@$ip 'cmd'
示例腳本
#!/bin/bash
#變量定義
ip_array=("192.168.1.1" "192.168.1.2" "192.168.1.3")
user="test1"
remote_cmd="/home/test/1.sh"
#本地通過ssh執行遠程服務器的腳本
for ip in ${ip_array[*]}
do
if [ $ip = "192.168.1.1" ]; then
port="7777"
else
port="22"
fi
ssh -t -p $port $user@$ip "remote_cmd"
done
這個方法還是很方便的,-t虛擬出一個遠程服務器的終端,在多臺服務器同時部署時確實節約了不少時間啊!
問題1:遠程執行腳本,腳本中有jar 命令的使用,在遠程機上沒問題,但是使用ssh -t 命令,卻提示:jar: 未找到命令
這是因爲虛擬出來的終端裏找不到jar 命令,不是遠程機上不存在,也不是本地機不存在。
修改方式:在初始化終端的文件裏設置java的環境變量,或是使用決定路徑調用jar 命令則可以找到
參考如下
linux啓動是自動加載的幾個文件說明bashrc等
(1)/etc/profile
全局(公有)配置,不管是哪個用戶,登錄時都會讀取該文件。
(2)/ect/bashrc
Ubuntu沒有此文件,與之對應的是/ect/bash.bashrc
它也是全局(公有)的
bash執行時,不管是何種方式,都會讀取此文件。
(3)~/.profile
若bash是以login方式執行時,讀取~/.bash_profile,若它不存在,則讀取~/.bash_login,若前兩者不存在,讀取~/.profile。
另外,圖形模式登錄時,此文件將被讀取,即使存在~/.bash_profile和~/.bash_login。
(4)~/.bash_login
若bash是以login方式執行時,讀取~/.bash_profile,若它不存在,則讀取~/.bash_login,若前兩者不存在,讀取~/.profile。
(5)~/.bash_profile
Unbutu默認沒有此文件,可新建。
只有bash是以login形式執行時,纔會讀取此文件。通常該配置文件還會配置成去讀取~/.bashrc。
(6)~/.bashrc
當bash是以non-login形式執行時,讀取此文件。若是以login形式執行,則不會讀取此文件。
(7)~/.bash_logout
註銷時,且是longin形式,此文件纔會讀取。也就是說,在文本模式註銷時,此文件會被讀取,圖形模式註銷時,此文件不會被讀取。
下面是在本機的幾個例子:
1. 圖形模式登錄時,順序讀取:/etc/profile和~/.profile
2. 圖形模式登錄後,打開終端時,順序讀取:/etc/bash.bashrc和~/.bashrc
3. 文本模式登錄時,順序讀取:/etc/bash.bashrc,/etc/profile和~/.bash_profile
4. 從其它用戶su到該用戶,則分兩種情況:
(1)如果帶-l參數(或-參數,–login參數),如:su -l username,則bash是lonin的,它將順序讀取以下配置文件:/etc/bash.bashrc,/etc/profile和~/.bash_profile。
(2)如果沒有帶-l參數,則bash是non-login的,它將順序讀取:/etc/bash.bashrc和~/.bashrc 和 /etc/bashrc
5. 註銷時,或退出su登錄的用戶,如果是longin方式,那麼bash會讀取:~/.bash_logout
6. 執行自定義的shell文件時,若使用“bash -l a.sh”的方式,則bash會讀取行:/etc/profile和~/.bash_profile,若使用其它方式,如:bash
a.sh, ./a.sh,sh a.sh(這個不屬於bash shell),則不會讀取上面的任何文件。
7. 上面的例子凡是讀取到~/.bash_profile的,若該文件不存在,則讀取~/.bash_login,若前兩者不存在,讀取~/.profile。