SSH遠程執行命令環境變量問題


SSH命令格式
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權限,但是有幾處限制:

  1. 遠程服務器禁止root用戶登錄
  2. 在遠程服務器腳本里轉換身份用expect需要send密碼,這樣不夠安全

 

ssh 執行遠程命令格式

ssh [options] [user@]host [command]

其中,host為想要連接到的OpenSSH服務器(遠程系統)的名稱,它是惟一的必需參數。host可以是某個本地系統的名稱,也可以是因特網上某個系統的FQDN(參見術語表)或者是一個IP地址。命令ssh host登錄到遠程系統host,使用的用戶名與正在本地系統上使用的用戶名完全相同。如果希望登錄的用戶名與正在本地系統上使用的用戶名不同,那么就應該包含user@。根據服務器設置的不同,可能還需要提供口令。

 
ssh遠程執行命令
如果沒有提供command參數,ssh就會讓你登錄到host上去。遠程系統顯示一個shell提示符,然后就能夠在host上運行命令。命令exit將會關閉與host的連接,並返回到本地系統的提示符。
 
1. ssh遠程執行簡單的命令
[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. 分號,兩個命令之間用分號隔開

 

 2. 通過shell腳本的方式遠程執行命令

 

示例一說明:
[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


免責聲明!

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



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