Запуск скрипта Bash через ssh - PullRequest
19 голосов
/ 03 марта 2010

Я пытаюсь написать сценарий 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 не создается. Как мне это исправить?

Ответы [ 5 ]

29 голосов
/ 03 марта 2010

Оболочка на локальном хосте выполняет подстановку переменных в $ NOW и $ BACKUP, потому что «EOI» не экранирован. Заменить

 ssh tunneluser@111.222.333.444 <<EOI

с

 ssh tunneluser@111.222.333.444 <<\EOI
16 голосов
/ 03 марта 2010

Переменные оцениваются в сценарии на локальном компьютере. Вам необходимо заменить знаки доллара на экранированные знаки доллара.

#!/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
6 голосов
/ 03 марта 2010

Ваш скрипт выполняет подстановку на локальном хосте перед отправкой.

Измените первую строку на:

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
0 голосов
/ 10 марта 2014

Как запустить локальный скрипт через 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 # для Ruby

Пошаговые пояснения

Этот скрипт выполняет следующие операции: 1 ° ловит первую строку #! получить интерпретатор (т.е. Perl, Python, Ruby, Bash интерпретатор), 2 ° запускает дистанционный интерпретатор по SSH, 3 ° отправьте все тело скрипта по SSH.

Локальный скрипт:

Локальный скрипт должен начинаться с #! / Path / to / интерпретатор - #! / bin / sh для скрипта Bash - #! / usr / bin / perl для сценария Perl - #! / usr / bin / python для скрипта Python - #! / usr / bin / ruby ​​для сценария Ruby

Этот сценарий основан не на расширении локального сценария, а на #! информация.

0 голосов
/ 03 марта 2010

Попробуйте:

NOW=`date +"%F"`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...