Ответ 1
Оболочка на локальном хосте выполняет замену переменных на $NOW и $BACKUP, потому что "EOI" не экранируется. Заменить
ssh [email protected] <<EOI
с
ssh [email protected] <<\EOI
Я пытаюсь написать 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 не создается. Как это исправить?
Оболочка на локальном хосте выполняет замену переменных на $NOW и $BACKUP, потому что "EOI" не экранируется. Заменить
ssh [email protected] <<EOI
с
ssh [email protected] <<\EOI
Переменные оцениваются в 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
Ваш 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
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
Этот script выполняет следующие операции: 1 ° ловит первую строчку #! для получения интерпретатора (т.е. Perl, Python, Ruby, Bash interpreter), 2 ° запускает удаленный интерпретатор через SSH, 3 ° отправить все тело script поверх SSH.
Локальный 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, но на #! информация.
Try:
NOW=`date +"%F"`