Подтвердить что ты не робот

Запуск A Bash Script За SSH

Я пытаюсь написать Bash script, который будет SSH в машину и создать каталог. Долгосрочная цель немного сложнее, но на данный момент я начинаю просто. Однако, как ни крути, я не могу, похоже, получить его. Здесь мой код:

#!/bin/bash
ssh -T [email protected] <<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 не создается. Как это исправить?

4b9b3361

Ответ 1

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

 ssh [email protected] <<EOI

с

 ssh [email protected] <<\EOI

Ответ 2

Переменные оцениваются в script на локальной машине. Вам нужно подписать знаки доллара с экранированными знаками доллара.

#!/bin/bash
ssh -T [email protected] <<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

Ответ 3

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

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

ssh -T [email protected] <<'EOI'

Это приведет к тому, что raw script будет отправлен и интерпретирован на вашем удаленном хосте.

Если вам нужен микс (например, если вы хотите, чтобы команда date выполнялась на вашем локальном хосте, вы должны оставить строку ssh без изменений и указать отдельную команду):

ssh -T [email protected] <<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

Ответ 4

Как запустить локальный script через SSH

Описание:

Script исполнение по SSH без копирования файла script. Вам нужна простая связь SSH и локальный script.

код:

#!/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 # для Python
  • ssh-remote-exec root @server1 myLocalScript.pl #for Perl
  • ssh-remote-exec root @server1 myLocalScript.rb #for Ruby

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

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

Локальный Script:

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

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

Ответ 5

Try:

NOW=`date +"%F"`