1. 程式人生 > >[隨筆] ssh遠端執行任務

[隨筆] ssh遠端執行任務

SSH 是 Linux 下進行遠端連線的基本工具,但是如果僅僅用它來登入那可是太浪費啦!SSH 命令可是完成遠端操作的神器啊,藉助它我們可以把很多的遠端操作自動化掉!下面就對 SSH 的遠端操作功能進行一個小小的總結。

遠端執行命令

如果我們要檢視一下某臺主機的磁碟使用情況,是不是必須要登入到目標主機上才能執行 df 命令呢?當然不是的,我們可以使用 ssh 命令在遠端的主機上執行 df 命令,然後直接把結果顯示出來。整個過程就像是在本地執行了一條命令一樣:

$ ssh [email protected] "df -h"

那麼如何一次執行多條命令呢?其實也很簡單,使用分號把不同的命令隔起來就 OK 了:

$ ssh [email protected] "pwd; cat hello.txt"

第一條命令返回的結果: /home/nick
這說明用這種方式執行命令時的當前目錄就是登陸使用者的家目錄。
第二條命令返回 hello.txt 檔案的內容。
注意,當命令多於一個時最好用引號括起來,否則在有的系統中除了第一個命令,其它都是在本地執行的。

執行需要互動的命令

有時候我們需要遠端執行一些有互動操作的命令。

$ ssh [email protected] "sudo ls /root"
$ ssh [email protected] "top"

這兩條命令雖然提示的失敗原因不同,但它們有一個共同點:都需要與使用者互動(需要 TTY)。所以它們失敗的原因也是相同的:


預設情況下,當你執行不帶命令的 ssh 連線時,會為你分配一個 TTY。因為此時你應該是想要執行一個 shell 會話。
但是當你通過 ssh 在遠端主機上執行命令時,並不會為這個遠端會話分配 TTY。此時 ssh 會立即退出遠端主機,所以需要互動的命令也隨之結束。
好在我們可以通過 -t 引數顯式的告訴 ssh,我們需要一個 TTY 遠端 shell 進行互動!
新增 -t 引數後,ssh 會保持登入狀態,直到你退出需要互動的命令。

作為總結,我們看看 -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 能輕鬆搞定!

你可以用單引號或雙引號開頭,然後寫上幾行命令,最後再用相同的引號來結束。
那麼如果需要在命令中使用引號該怎麼辦?
其實針對類似的情況有一條比較通用的規則,就是混合使用單雙引號。這條規則在這裡也是適用的:

當我們在命令中引用了變數時會怎麼樣呢?

請注意上圖中的最後一行,並沒有輸出我們期望的 nick。這裡多少有些詭異,因為如果變數沒有被解釋的話,輸出的應該是 $name 才對。但是這裡卻什麼都沒有輸出。
對於引用變數的寫法,可以通過下面的方式保證變數被正確解釋:

注意,我們在上圖的命令中為 bash 指定了 -c 引數。

遠端執行指令碼

對於要完成一些複雜功能的場景,如果是僅僅能執行幾個命令的話,簡直是弱爆了。我們可能需要寫長篇累牘的 shell 指令碼去完成某項使命!此時 SSH 依然是不辱使命的好幫手(哈哈,前面的內容僅僅是開胃菜啊!)。

執行本地的指令碼

我們在本地建立一個指令碼檔案 test.sh,內容為:

ls
pwd

然後執行下面的命令:

$ ssh [email protected] < test.sh

通過重定向 stdin,本地的指令碼 test.sh 在遠端伺服器上被執行。

接下來我們我期望能為指令碼 test.sh 傳遞一個引數,為了驗證傳入的引數,在 test.sh 檔案的末尾新增兩行:

echo $0
echo $1

然後嘗試執行下面的命令:

$ ssh [email protected]xxx.xxx.xxx.xxx < test.sh helloworld
$ ssh [email protected]xxx.xxx.xxx.xxx < "test.sh helloworld"

下圖顯示了執行的結果:

看來上面的方法都無法為指令碼傳遞引數。
要想在這種情況下(遠端執行本地的指令碼)執行帶有引數的指令碼,需要為 bash 指定 -s 引數:

$ ssh [email protected]xxx.xxx.xxx.xxx 'bash -s' < test.sh helloworld

在上圖的最後兩行,輸出的是 "bash" 和 "helloworld" 分別對應 $0 和 $1。

執行遠端伺服器上的指令碼

除了執行本地的指令碼,還有一種情況是指令碼檔案存放在遠端伺服器上,而我們需要遠端的執行它!
此時在遠端伺服器上使用者 nick 的家目錄中有一個指令碼 test.sh。檔案的內容如下:

ls
pwd

執行下面的命令:

$ ssh [email protected] "/home/nick/test.sh"

注意,此時需要指定指令碼的絕對路徑!

下面我們也嘗試為指令碼傳遞引數。在遠端主機上的 test.sh 檔案的末尾新增兩行:

echo $0
echo $1

然後嘗試執行下面的命令:

$ ssh [email protected]xxx.xxx.xxx.xxx /home/nick/test.sh helloworld

真棒,最後兩行 "/home/nick/test.sh" 和 "helloworld" 分別對應 $0 和 $1。

ssh遠端的引號中,可以引用本地變數$a,也可以加反斜線引用遠端自己的變數\$a

shell 間接變數引用的問題

1.感嘆號的使用

  1. aaa=123  
  2. bbb=aaa  
  3. echo $bbb  
  4. echo ${!bbb}  
輸出結果:

aaa

123

可見,感嘆號是可以引用間接變數的值

2.eval的使用

  1. aaa=123  
  2. bbb=aaa  
  3. echo $bbb  
  4. eval ccc=\${$bbb}  
  5. echo $ccc  
輸出結果:

aaa

123

問題:當遇到星號後,間接引用與程式設計者期望輸出不一致的現象

例:輸出/root/.ssh/目錄下所有的檔案

  1. SSHCONFIGDIR="/root/.ssh"
  2. SSHCONFIG="*"
  3. dir=SSHCONFIGDIR  
  4. files=SSHCONFIG  
  5. ls ${!dir}/${!files} #這樣是沒問題的,可以輸出/root/.ssh/known_hosts  
  6. files_temp=${!files}  #這一步,shell已經把星號解析成當前目錄下所有的檔案了,所以files_temp不再是"*",而是當前目錄下所有檔案的字串了。  
  7. ls ${!dir}/$files_temp #想想這樣會有什麼問題?  

總結

本文通過 demo 演示了 ssh 遠端操作的基本方式。這些基本用法將為我們在更復雜的場景中完成各種艱鉅的任務打下基礎。


相關推薦

[隨筆] ssh遠端執行任務

SSH 是 Linux 下進行遠端連線的基本工具,但是如果僅僅用它來登入那可是太浪費啦!SSH 命令可是完成遠端操作的神器啊,藉助它我們可以把很多的遠端操作自動化掉!下面就對 SSH 的遠端操作功能進行一個小小的總結。遠端執行命令如果我們要檢視一下某臺主機的磁碟使用情況,是不

Python開源Devops定時任務管理系統(含定時呼叫介面、定時ssh遠端執行命令)

 OpenMangosteen Devops定時呼叫http介面,定時執行SSH命令的WEB定時任務工具。本系統強依賴Flask-APScheduler的功能,只是拓展了web頁面部分。使用Pytho

SSH遠端執行Linux Shell命令

使用強大的paramiko Linux伺服器需要注意防火牆設定和SSH的開啟 注意執行的shell命令前提是Linux系統上有的 #!/usr/bin/python #coding=utf-8 import paramiko import threading import

RabbitMQ遠端執行任務RPC。

如果想發一條命令給遠端機器,再把結果返回 這種模式叫RPC:遠端過程呼叫 傳送方將傳送的訊息放在一個queue裡,由接收方取。 接收方再把執行結果放在另外一個queue裡,由傳送方取 實際上,傳送方把1,隨機生成的接收queue名 2,UUID值發過去了(用於確認) 客戶端:作用是傳送指令

ssh 遠端執行命令

SSH 是 Linux 下進行遠端連線的基本工具,不光可以登入,也可以遠端操作。接下來我們詳細講解一些常用的情況。 1、執行簡單的命令: 1)檢視某臺主機上的磁碟使用情況: $ ssh [email protected] "df -h" ***********

ssh 遠端執行多個命令,有萬用字元要使用雙引號,沒有則可以不用

#!/bin/sh  for i in {2..25}  do         ip=10.161.21.$i         echo $ip         t=`ssh [email protected]$ip    "ls /home/unicom

ssh遠端執行命令並自動退出

ssh命令格式如下: usage: ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec] [-D

ssh遠端執行命令

我們直接可以通過ssh命令,直接遠端機器執行命令,那麼我們是不是就可以通過用for迴圈的命令對遠端的機器安裝服務了呢。。 ssh   [email protected]  “yum -y install nginx” 通過上面的命令,可以實現批量

JSch連線SSH遠端執行命令

package test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.Arr

ssh遠端批量替換某個檔案中的字串,ssh遠端執行sudo指令

360xh01~360xh07先做祕鑰驗證然後把lw使用者sudo做無密碼驗證批量查詢某個使用者有沒有定時任務for i in [email protected] [email protected] [email protected] [ema

ssh遠端執行nohup命令不退出

Linux系統下,使用預設使用者root。遠端target機器的主目錄下有個指令碼test.sh,可執行許可權,內容只有一條命令:sleep 10 在本地機器上執行 ssh target "nohup ./test.sh &",結果ssh不立即退出,等test.sh

ssh遠端執行sed -i命令,替換的內容中含有雙引號的問題

在ssh 中執行sed -i 來替換匹配的字串,當替換的內容中包含雙引號"時,需要在轉義的同時,加上單引號'\"' 示例如下 <?xml version="1.0" encoding="UTF-8"?> <channel name=

Java實踐 — SSH遠端執行Shell指令碼

1. SSH簡介         SSH是Secure Shell的縮寫,一種建立在應用層和傳輸層基礎上的安全協議。SSH在連線和傳送過程中會加密所有資料,可以用來在不同系統或者伺服器之間進行安全連線。SSH提供兩種的安全驗證方式:基於密碼的認證和基於密匙的認證。其中,基於

ssh 遠端執行遠端機上的指令碼或命令

單命令執行: ssh [email protected] "cd /home ; ls" 今天 遠端執行命令發現了一個問題: 當執行下面命令 ssh -o ConnectTimeout=60 -qn [email protected] "cd

ssh遠端執行命令退出

問題描述:         shell指令碼中需要用ssh遠端到其他伺服器執行命令,但是執行完成不返回。 解決方法: ssh [email protected]IP > /dev/null 2>&1 << EOF     rm -

SSH遠端登入執行命令指令碼

一、簡述 運維工作中遠端登入執行命令的指令碼很常用,下面分享一下我常用的指令碼 二、指令碼內容 #!/bin/bash SCRIPT_NAME=`basename $0` CURRENT_DIR=$(

python利用paramiko實現ssh連線及遠端執行命令

python3.6, windows下 1,安裝paramiko模組 依賴cryptography:使用命令easy_install安裝該模組時,如果報錯“...microsoft visual c++ 14.0 is required.”, 可以下載.whl檔案,使用命令pip instal

Java使用SSH遠端訪問Windows並執行命令

轉載至:http://blog.csdn.net/carolzhang8406/article/details/6760430 windows由於沒有預設的ssh server,因此在允許ssh之前需要先安裝ssh server。 下載freeSSHd http://ww

Linux下使用SSH非互動式遠端執行命令指令碼

原創文章,轉載請註明— 作者: 黃文海 出處: http://viscent.iteye.com/http://blog.viscenthuang.info     非互動式在遠端主機上執行命令或者指令碼可以幫助我們快速完成一些任務。比如,在叢集環境中,同時在各個結點上的日