Запущение скрипта Bash по 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 кажутся пустыми, и резервный каталог / не создается. Как я фиксирую это?

19
задан codeforester 1 March 2018 в 17:43
поделиться

4 ответа

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

 ssh tunneluser@111.222.333.444 <<EOI

на

 ssh tunneluser@111.222.333.444 <<\EOI
29
ответ дан 30 November 2019 в 02:39
поделиться

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

#!/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
16
ответ дан 30 November 2019 в 02:39
поделиться

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

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

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
6
ответ дан 30 November 2019 в 02:39
поделиться

Попробуйте:

NOW=`date +"%F"`
-1
ответ дан 30 November 2019 в 02:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: