簡體   English   中英

通過 ssh 運行 Bash 腳本

[英]Running a Bash script over ssh

我正在嘗試編寫一個 Bash 腳本,它將通過 SSH 連接到一台機器並創建一個目錄。 長期目標有點復雜,但現在我從簡單開始。 然而,雖然很簡單,但我似乎不太明白。 這是我的代碼:

#!/bin/bash
ssh -T tunneluser@111.222.333.444 <<EOI

# Fix "TERM environment variable undefined" error.
TERM=dumb
export TERM

# Store todays date.
NOW=$(date +"%F")
echo $NOW

# Store backup path.
BACKUP="/backup/$NOW"
[ ! -d $BACKUP ] && mkdir -p ${BACKUP}
echo $BACKUP

exit
EOI

它運行時沒有任何顯式錯誤。 但是,回顯的 $NOW 和 $BACKUP 變量顯示為空,並且未創建 /backup 目錄。 我該如何解決?

本地主機上的 shell 正在對 $NOW 和 $BACKUP 進行變量替換,因為“EOI”沒有被轉義。 代替

 ssh tunneluser@111.222.333.444 <<EOI

 ssh tunneluser@111.222.333.444 <<\EOI

正在本地計算機上的腳本中評估變量。 您需要用轉義的美元符號代替美元符號。

#!/bin/bash
ssh -T tunneluser@111.222.333.444 <<EOI

# Fix "TERM environment variable undefined" error.
TERM=dumb
export TERM

# Store todays date.
NOW=\$(date +"%F")
echo \$NOW

# Store backup path.
BACKUP="/backup/\$NOW"
[ ! -d \$BACKUP ] && mkdir -p \${BACKUP}
echo \$BACKUP

exit
EOI

您的腳本在發送之前正在本地主機上進行替換。

將第一行更改為:

ssh -T tunneluser@111.222.333.444 <<'EOI'

這將導致原始腳本在您的遠程主機上被發送和解釋。

如果您想要混合(例如,如果您想要在本地主機上執行date命令,您應該保持 ssh 行不變並引用單個命令):

ssh -T tunneluser@111.222.333.444 <<EOI

# Execute the date command on the local machine.  The assignment still
# happens on the remote machine
NOW=$(date +"%F")

# Quote your $ so that the replacement happens on the remote machine
echo \$NOW

如何通過 SSH 運行本地腳本

概要:

通過 SSH 執行腳本,無需復制腳本文件。 您需要一個簡單的 SSH 連接和一個本地腳本。

代碼:

#!/bin/sh
print_usage() {
        echo -e "`basename $0` ssh_connexion local_script"
        echo -e "Remote executes local_script on ssh server"
        echo -e "For convinient use, use ssh public key for remote connexion"
        exit 0
}

[ $# -eq "2" ] && [ $1 != "-h" ] && [ $1 != "--help" ] || print_usage

INTERPRETER=$(head -n 1 $2 | sed -e 's/#!//')

cat $2 | grep -v "#" | ssh -t $1 $INTERPRETER

例子:

  • ssh-remote-exec root@server1 myLocalScript.sh #for Bash
  • ssh-remote-exec root@server1 myLocalScript.py #for Python
  • ssh-remote-exec root@server1 myLocalScript.pl #for Perl
  • ssh-remote-exec root@server1 myLocalScript.rb #for Ruby

分步說明

此腳本執行以下操作: 1° 捕獲第一行 #! 要獲得解釋器(即:Perl、Python、Ruby、Bash 解釋器),2° 通過 SSH 啟動遠程交互器,3° 通過 SSH 發送所有腳本主體。

本地腳本:

本地腳本必須以 #!/path/to/interpreter 開頭 - Bash 腳本的 #!/bin/sh - Perl 腳本的 #!/usr/bin/perl - Python 腳本的 #!/usr/bin/python - #! /usr/bin/ruby 用於 Ruby 腳本

此腳本不是基於本地腳本擴展名,而是基於 #! 信息。

嘗試:

NOW=`date +"%F"`

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM