Shell Script SSH поведения - PullRequest
       18

Shell Script SSH поведения

0 голосов
/ 05 августа 2011

Я начал кодировать сценарии оболочки в течение примерно 2 дней

В настоящее время у меня есть следующий код

echo "Permission to Access to Remote Machine"
ssh $USERNAME@$HOSTNAME  "pg_dump -f /dbexport.sql -t tb1 -t tb2 -t tb3 dbname"
echo "Permission to Access to Remote Machine to transfer data file"
scp $USERNAME@$HOSTNAME:/dbexport.sql /export/bin/
echo "Permission to delete temporary file on remote machine"
ssh $USERNAME@$HOSTNAME  "rm /dbexport.sql"
echo "Creating Database..."

Теперь у меня есть 2 вопроса

1 - есть лихороший способ сделать эту операцию за один раз?Я должен сделать это 3 раза в настоящее время ... и я не хочу использовать ожидают, ни другой сторонний скрипт, ни я хочу использовать ключи RSA для аутентификации ssh

2 - есть ли способ узнать, есличто-то не так в этих командах?

Большое спасибо

Ответы [ 4 ]

2 голосов
/ 05 августа 2011

Чтобы удаленно вывести базу данных в локальный файл, я бы сбросил ее в стандартный вывод и перенаправил бы ее локально, например,

ssh $USERNAME@$HOSTNAME "pg_dump -f /dev/stdout -t tb1 -t tb2 -t tb3 dbname" > /export/bin/dbexport.sql

Код возврата командной строки, выполненной на сервере, возвращается вам каккод возврата вызова ssh.Если ssh не удается (например, проблема с соединением), вы получаете 255. Если все в порядке, вы получаете 0.

Bash предоставляет вам код возврата последней выполненной команды в переменной оболочки $ ?.Вы можете использовать его следующим образом:

ssh $USERNAME@$HOSTNAME "pg_dump -f /dev/stdout -t tb1 -t tb2 -t tb3 dbname" > /export/bin/dbexport.sql
err=$?
if [ $err -ne 0 ]; then
  echo "Dump failed with error code ${err}!"
fi

Или, если вас не интересует точное значение:

if ! ssh $USERNAME@$HOSTNAME "pg_dump -f /dev/stdout -t tb1 -t tb2 -t tb3 dbname" > /export/bin/dbexport.sql; then
  echo "Dump failed!"
fi

Справочная страница pg_dump, вероятно, даст вам коды ошибок.для этого.Со страницы руководства ssh:

EXIT STATUS
     ssh exits with the exit status of the remote command or with 255 if an
     error occurred.
0 голосов
/ 03 июля 2013

Копирование с удаленного сервера на локальный компьютер без создания файла, используйте канал

ssh -C {ssh.user rout@ enjremote_host} \ 'PGPASSWORD = {remote_dbpassword} pg_dump -U {remote_dbuser} {remote_dbname} |bzip2 -c '\ |bunzip2 -dc |PGPASSWORD = {local_dbpassword} psql -U {local_dbuser} {local_dbname}

0 голосов
/ 08 августа 2011

Если вы абсолютно не хотите работать с ключами (чего я не понимаю), есть способ открыть соединение и впоследствии использовать его.

Вы можете работать с опциями ssh ControlMaster и ControlPath: сначала используйте ControlMaster=yes для установления соединения, запрашивая пароль и оставляя контрольный сокет в том месте, которое вы сказали сделать с помощью ControlPath , Затем скажите вашим командам ssh использовать этот сокет с ControlMaster=no.

echo "Creating control socket"
ssh $USERNAME@$HOSTNAME -o ControlMaster=yes,ControlPath=whereveryouwant -Nf
echo "Permission to Access to Remote Machine"
ssh $USERNAME@$HOSTNAME -o ControlMaster=no,ControlPath=whereveryouwant "pg_dump -f /dbexport.sql -t tb1 -t tb2 -t tb3 dbname"
echo "Permission to Access to Remote Machine to transfer data file"
scp -o ControlMaster=no,ControlPath=whereveryouwant $USERNAME@$HOSTNAME:/dbexport.sql /export/bin/
echo "Permission to delete temporary file on remote machine"
ssh $USERNAME@$HOSTNAME -o ControlMaster=no,ControlPath=whereveryouwant "rm /dbexport.sql"
echo "Creating Database..."

Но здесь я не совсем уверен, как избавиться от этого контрольного соединения, которое может представлять угрозу безопасности, в нужное время. Возможно, вы замените -Nf на -f 'sleep 30m'`, в зависимости от того, как долго будет длиться весь процесс.

Другой альтернативой может быть, если на удаленном стандартном выводе нет других выходных данных, получить дамп SQL напрямую через канал без использования временного файла.

ssh $USERNAME@$HOSTNAME "pg_dump -f - -t tb1 -t tb2 -t tb3 dbname"  > /export/bin/dbexport.sql

Короткий, аккуратный, без потенциально мешающих промежуточных файлов. (Но я не уверен насчет части -f - - может быть, есть другой способ сказать pg_dump выводить свои данные в stdout.)

0 голосов
/ 05 августа 2011

Что касается вашего первого вопроса, я не могу придумать хорошего способа объединить три команды в одну. Если бы они выполняли все команды на удаленном компьютере, вы могли бы сделать что-то вроде

ssh user@remote sh -c 'dothis ; dothat'

но у вас есть scp в середине. Я бы использовал ключ RSA или DSA, но вы сказали, что не хотите этого делать (почему?).

Для второго вопроса обе команды ssh и scp возвращают статус, указывающий, успешно ли они выполнены. Например, это:

ssh user@remote /bin/false ; echo $?

должен напечатать 1, указывая на ошибку. (Измените $? на $status, если вы используете csh или tcsh.) Прочтите справочные страницы (man ssh, man scp) и найдите раздел «СОСТОЯНИЕ ВЫХОДА» внизу.

...