『壹』 本地shell腳本中ssh到遠程伺服器並執行命令
在實際運用中在當前伺服器執行命令後,需要在另一台伺服器繼續執行某些命令,分開去到另一台伺服器執行也是比較麻煩的,因此整理下集中執行的方式
1、首先配置ssh免密操作
linux 下實現SSH互信: https://www.jianshu.com/p/2456d98aa607
2、簡單命令
ssh [email protected] "cd /var/lib; ls; cd "
2.1 使用時注意,雙引號必須有。若沒加雙引號,第二條及之後的命令會在本地執行
2.2 分號是將兩條語句間隔開
2.3 單雙引的區別:單引號不會解析值,是什麼就傳什麼;雙引號會解析值,將解析結果傳過去
3、多條命令
ssh [email protected]<< reallssh
cd /var/lib/test
tar -zxvf api.com.tar.gz
......
exit
reallssh
3.1 命令寫在 << reallssh(開始) 至 reallssh(結束) 之間
3.2 reallssh可自己定義為其他形式
3.3 在結束前加上exit退出遠程
4、可能遇到的問題
問題:遠程登錄主機時出現Pseudo-terminal will not be allocated because stdin is not a terminal. 錯誤
解決方案:字面意思是偽終端將無法分配,因為標准輸入不是終端。
所以需要增加-t -t參數來強制偽終端分配,即使標准輸入不是終端。
to force pseudo-tty allocation even if stdin isn』t a terminal.
參考樣例如下:
ssh -t -t [email protected] -p 22
--------------------------------------------------------------------------------
參考:https://blog.csdn.net/jinking01/article/details/84386769
『貳』 如何通過SSH遠程運行命令自動化
從客戶端來看,SSH提供兩種級別的安全驗證。 第一種級別(基於口令的安全驗證),只要你知道自己的帳號和口令,就可以登錄到遠程主機,並且所有傳輸的數據都會被加密。但是,這種驗證方式不能保證你正在連接的伺服器就是你想連接的伺服器。
『叄』 python 模擬 ssh 執行遠程命令
日常開發連接 Linux 伺服器,都會用到 ssh 客戶端的軟體
其實 python 有一個模塊,可以簡單模擬一個 ssh 客戶端/服務端
編寫一些自動化的的任務時,會經常和它打交道
簡單記錄一下 paramiko 的基本使用
paramiko 不是標准庫,需要自行安裝
要求 py2.7,3.4 版本以上 [1]
在得到一個 ssh_client 客戶端連接對象後
第一次和伺服器建立連接,需要選擇是否自動將伺服器的 host_key 公鑰,記錄在本地
因為,在計算機的世界裡,沒有永久的朋友-- IP 短時間里不會刷新,但是系統可能隨時被重置
否則會報錯提示:
可以加入 logging 模塊,查看詳細的通訊過程
使用三個變數,獲取返回的信息對象
讀取命令的執行結果
『肆』 shell實現SSH自動登陸
[TOC]
註:需要執行許可權,可通過 sudo chmod +x ./file_name.sh 添加
sh file_name.sh 就是指定了腳本解釋器 /bin/sh 來解釋執行腳本;常見的腳本解釋器還有: /bin/bash 等,我們可以使用 ls -l /bin/*sh 命令來查看當前可用的腳本解釋器;
這種方式不會像前兩種方式一樣fork一個子進程去執行腳本,而是使用當前shell環境執行。我們不必重啟shell或者重新登錄系統,就能使當前的更改生效。一般用於 .bashrc或者.bash_profile被修改的時候,
定義:我們寫一個shell腳本時,總是習慣在最前面加上一行 #!/binbash ,它就是腳本的 shebang 。
作用:它指示了此腳本運行時的解釋器,使用文件名直接執行shell腳本時,必須帶上shebang。
使用:可以在shebang後面直接附加選項,執行時我們默認使用選項執行;
如 test.sh 的 shebang 為 #!/bin/sh -x ,那我們執行腳本時:
./test.sh hello 相當於: bin/sh -x ./test.sh hello ;
注意:在指定腳本解釋器來執行腳本時,shebang會被指定的腳本解釋器覆蓋。
expect是一個能實現自動和互動式任務的解釋器,它也能解釋常見的shell語法命令,其特色在以下幾個命令:
spawn command 命令會fork一個子進程去執行command命令,然後在此子進程中執行後面的命令;
它的一般用法為 expect "string" ,即期望獲取到string字元串,可在在string字元串里使用 * 等通配符; string 與命令行返回的信息匹配後,expect會立刻向下執行腳本;
set timeout n 命令將expect命令的等待超時時間設置為n秒,在n秒內還沒有獲取到其期待的命令,expect 為false,腳本會繼續向下執行;
一般用法為 send "string\r" , 向命令行輸入一條信息, \r 表示輸入回車;
創建腳本 touch aliyun_login_shell.sh ,內容如下:
執行 sudo chmod +x ./aliyun_login_shell.sh 命令給shell腳本添加執行許可權;
運行 ./aliyun_login_shell.sh 命令,一鍵登陸成功!
優化一下:
腳本完成了,可是還是有些小瑕疵:
這里我們想到了linux的alias命令:
執行命令 vim ~./bash_profile ,在文件內部添加:
再使用 . ~./bash_profile 或 source ~./bash_profile
從此,我們無論在哪個目錄,只要輸入 alias_name 命令,回車,真正的一鍵登陸!
參考:
https://www.cnblogs.com/qiumingcheng/p/11544569.html
『伍』 SSH中在文件下執行命令
# screen [-AmRvx -ls -wipe][-d <作業名稱>][-h <行數>][-r <作業名稱>][-s ][-S <作業名稱>]
參數說明
-A 將所有的視窗都調整為目前終端機的大小。
-d <作業名稱> 將指定的screen作業離線。
-h <行數> 指定視窗的緩沖區行數。
-m 即使目前已在作業中的screen作業,仍強制建立新的screen作業。
-r <作業名稱> 恢復離線的screen作業。
-R 先試圖恢復離線的作業。若找不到離線的作業,即建立新的screen作業。
-s 指定建立新視窗時,所要執行的shell。
-S <作業名稱> 指定screen作業的名稱。
-v 顯示版本信息。
-x 恢復之前離線的screen作業。
-ls或--list 顯示目前所有的screen作業。
-wipe 檢查目前所有的screen作業,並刪除已經無法使用的screen作業。
『陸』 教你如何通過ssh控制遠程主機,遠程執行命令
教你如何通過ssh控制遠程主機,遠程執行命令ssh控制遠程主機遠程執行命令這個分兩步,很簡單很實用。第一步,設置ssh免認證,免認證就是只不用密碼認證就可以直接登錄,這在寫腳本伺服器控制時特別有用。每二步,就是到遠端伺服器上去執行命令
假如現在有兩個伺服器,一個叫SA,另一個叫SB。現在我要在SA上去控制SB。
格式:ssh
SB_用戶名@SB_IP
命令for
example:ssh
[email protected]
echo
aaa>>hzs_test.txtssh
[email protected]
'echo
-e
haha/n
hoho
>>hzs_test.txt'
『柒』 ssh如何遠程執行命令
ssh支持遠程命令參數 可以類似方式嵌套: alias pushbaby='cd /Users/xuqiang/Develop/work/tickets/baby/deploy;scp -r -v -i ~/.ssh/pedal/id_rsa baby.tar.gz baby.sql.txt [email protected]:/home/qiang.xu/tmp;ssh [email protected] -i ~/.ssh/pedal/id_rsa "source ~/.bash_profile;pushbaby";ssh [email protected] -i ~/.ssh/pedal/id_rsa "ssh [email protected] \"source ~/.bash_profile;pushbaby\""'更新要注意的是alias在非交互模式無法使用,需將替換成function
『捌』 ssh遠程連接伺服器執行命令
首先說一下使用ssh遠程連接伺服器執行命令的方法:
為了方便描述,這里把測試伺服器稱之為A1,目標伺服器稱之為A2
如果可以直接登錄到A2,則配置成功!
下面來說問題:
ssh在遠程連接伺服器執行命令的時候,經常會遇到環境變數的問題,如下:
如果出現上面的提示,則說明環境變數配置有問題。
先來說解決辦法
問題解決!
這里就要說明bash有兩種方式interactive + login shell模式和non-interactive + non-login shell模式
在伺服器上執行命令,走的是interactive + login shell模式,而通過遠程登錄執行命令,走的是non-interactive + non-login shell模式。
這兩種模式對於環境變數的讀取是有區別的。
Shell首先會載入/etc/profile文件,然後再嘗試依次去載入下列三個配置文件之一,一旦找到其中一個便不再接著尋找:
~/.bash_profile
~/.bash_login
~/.profile
所以當遠程執行命令時,我們只需要讓~/.bashrc文件中的環境變數與/etc/profile中的環境變數一致即可!
參考:
如何解決SSH遠程執行命令找不到環境變數的問題
『玖』 簡單的ssh腳本怎麼編寫寫一個Linux下自動執行命令安裝mysql,jdk等的ssh腳本怎麼寫
這個網上很多根本不需要去琢磨吧,網路一鍵安裝lanp 就看到了
『拾』 windows下python實現自動ssh網路設備執行多條命令並保存顯示結果用什麼庫實現
假設從主機A,檢查主機B上的進程,
需要在主機B上建立檢查用戶,例如叫x,
並設置通過public key認證登錄SSH,不會可以google搜一下,
然後,在A機器上執行:
ssh x@B ~/command.sh > result.txt
command.sh就是B機器上放置在x目錄下的腳本。
輸出結果應該是寫到了result.txt
或者另一種寫法
result=`ssh x@B ~/command.sh`
結果直接保存到result變數中了。
暫時沒有linux環境,所以沒有實際測試,你自己試試吧