usage: ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec]
[-D [bind_address:]port] [-e escape_char] [-F configfile]
[-I pkcs11] [-i identity_file]
[-L [bind_address:]port:host:hostport]
[-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
[-R [bind_address:]port:host:hostport] [-S ctl_path]
[-W host:port] [-w local_tun[:remote_tun]]
[user@]hostname [command]
主要參數說明
-l 指定登入用戶
-p 設置端口號
-f 后台運行,並推薦加上 -n 參數
-n 將標准輸入重定向到 /dev/null,防止讀取標准輸入。如果在后台運行ssh的話(-f選項),就需要這個選項。
-N 不執行遠程命令,只做端口轉發
-q 安靜模式,忽略一切對話和錯誤提示
-T 禁用偽終端配置
-t (tty)為遠程系統上的ssh進程分配一個偽tty(終端)。如果沒有使用這個選項,當你在遠程系統上運行某條命令的時候,ssh不會為該進程分配tty(終端)。相反,ssh將會把遠端進程的標准輸入和標准輸出附加到ssh會話上去,這通常就是你所希望的(但並非總是如此)。這個選項將強制ssh在遠端系統上分配tty,這樣那些需要tty的程序就能夠正常運行。
-v verbose)顯示與連接和傳送有關的調試信息。如果命令運行不太正常的話,這個選項就會非常有用。
ssh控制遠程主機,遠程執行命令步驟
第一步,設置ssh免認證,免認證就是不用密碼認證就可以直接登錄,這在寫腳本服務器控制時特別有用。
每二步,就是到遠端服務器上去執行命令
准備工作
基於公私鑰認證(可參考:Linux配置SSH密鑰登錄詳解及客戶端測試使用無密碼登錄)或者用戶名密碼認證(可參考:SSH使用expect自動輸入密碼、命令實現非交互式密碼授權)能確保登錄到遠程服務器
cmd如果是腳本,注意絕對路徑問題(相對路徑在遠程執行時就是坑)
基於公私鑰認證遠程登錄可能存在的不足
這個可以滿足我們大多數的需求,但是通常運維部署很多東西的時候需要root權限,但是有幾處限制:
- 遠程服務器禁止root用戶登錄
- 在遠程服務器腳本里轉換身份用expect需要send密碼,這樣不夠安全
ssh 執行遠程命令格式
ssh [options] [user@]host [command]
其中,host為想要連接到的OpenSSH服務器(遠程系統)的名稱,它是惟一的必需參數。host可以是某個本地系統的名稱,也可以是因特網上某個系統的FQDN(參見術語表)或者是一個IP地址。命令ssh host登錄到遠程系統host,使用的用戶名與正在本地系統上使用的用戶名完全相同。如果希望登錄的用戶名與正在本地系統上使用的用戶名不同,那么就應該包含user@。根據服務器設置的不同,可能還需要提供口令。
[root@web01 data]# ls /data/
10.0.0.7 web01
[root@web02 data]# ls /data/
10.0.0.8 web02
//ssh遠程執行一個命令
[root@web01 data]# ssh 10.0.0.8 ls /data
10.0.0.8
web02
//ssh遠程執行兩個命令,不加引號
[root@web01 data]# ssh 10.0.0.8 ls /data;ls //沒有加雙引號,第二個ls直接在本地的目前所在目錄執行
10.0.0.8
web02
10.0.0.7 web01
//ssh遠程執行兩個命令,加引號(無變量,單雙引號都行)
[root@web01 data]# ssh 10.0.0.8 'ls /data;ls'
10.0.0.8
web02
anaconda-ks.cfg
install.log
install.log.syslog
nginx.sh
1. 如果想在遠程機器上連續執行多條命令,可以用單引號或者雙引號將這些命令括起來。
2. 如果不加單引號或者雙引號,第二個ls命令在本地執行。
- 例如 ssh user@node cd /local ls 則 ls 只會執行 cd /local 命令,ls命令在本地執行,加了雙引號或者單引號,則被括起來的命令被當做ssh命令的一個參數,所以會在遠程連續執行。
3. 分號,兩個命令之間用分號隔開
示例一說明:
[root@web01 data]# cat /server/scripts/ssh.sh #!/bin/bash ssh root@10.0.0.8 > /dev/null 2>&1 << eeooff cd /home touch abcdefg.txt exit eeooff echo done! [root@web01 data]# sh /server/scripts/ssh.sh done! [root@web01 data]# ssh 10.0.0.8 "ls /home" abcdefg.txt oldboy web 遠程執行的內容在“<< eeooff ” 至“ eeooff ”之間,在遠程機器上的操作就位於其中,注意的點: 1. << eeooff,ssh后直到遇到eeooff這樣的內容結束,eeooff可以隨便修改成其他形式。 2. 重定向目的在於不顯示遠程的輸出了 3. 在結束前,加exit退出遠程節點 鏈接:http://www.cnblogs.com/ilfmonday/p/ShellRemote.html
示例二說明: #!/bin/bash ssh root@192.168.0.23 < < remotessh killall -9 java cd /data/apache-tomcat-7.0.53/webapps/ exit remotessh 遠程執行的內容在"< < remotessh " 至" remotessh "之間
在遠程機器上的操作就位於其中,注意的點:<< remotessh,ssh后直到遇到remotessh這樣的內容結束,remotessh可以隨便修改成其他形式。
在結束前,加exit退出遠程節點 如果不想日志文件在本機出現可以修改配置 ssh root@192.168.0.23 > /dev/null 2>&1 < < remotessh
https://blog.csdn.net/sn3009/article/details/52779642
3. 查看遠程服務器的CPU信息
https://www.cnblogs.com/softidea/p/6855045.html
example:
find ./ ! -path "./output/*" ! -path "./output1/*" -type f | xargs grep ""
https://blog.51cto.com/xoyabc/2108052