Статус кода возврата SSH и обработка ошибок

Начнем с того, что вы не можете внести это изменение, находясь в данный момент под пользователем, для которого вы хотите изменить домашний каталог, потому что usermod дает сбой, когда с тем же именем пользователя запущены другие процессы. Есть способы изменить свой домашний каталог через другую учетную запись на машине, которая имеет привилегии суперпользователя. Если позволить этим изменениям выполняться в реальном времени, это также испортит такие вещи, как bash, если не все необходимые файлы будут отредактированы, чтобы сообщить Linux, где находится новый каталог.

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

0
22.08.2020, 04:19
3 ответа

Ваши коды выхода, такие как -9991, не имеют смысла в любом скрипте. Они будут усечены по модулю 256 и возвращены как положительные в диапазоне от 0 -до 255. Значения 128 и выше имеют обычное значение (и завершаются сигналом ), а значения примерно от 124 до 127 используются для оболочки. ошибки процесса. Вы также не можете надежно использовать код состояния для счетчика.

ssh и scp возвращают собственное состояние --доступна ли удаленная система, в порядке ли ваши учетные данные, работает ли удаленная служба? У них нет механизма возврата статуса удаленных команд. Вам необходимо передать любую информацию (, такую ​​как результат удаленного сценария ), обратно в виде данных, возвращенных удаленной командой, и, следовательно, идентифицируемых как недействительные данные :, например STATUS::9991, если вам это нужно.

Если вы хотите захватить stderr удаленной команды, вы, вероятно, захотите перенаправить его 2>&1внутри команды ssh.

0
18.03.2021, 23:11
  1. if [ `ssh v0021x91 ls /apps/oracle/home/DB_1201/*.dmp | wc -l` -eq 0 ]

    Порядок оценки таков, что подстановочный знак оценивается до выполнения команды ssh. Если /apps/oracle/home/DB_1202/*.dmpсоответствует одному или нескольким файлам на локальном хосте , оно будет заменено именем (s )этого файла (s ). В противном случае звездочка останется и будет передана удаленной стороне как буквальная.

    Затем удаленная оболочка оценит шаблон перед выполнением команды ls, либо расширив его до одного или нескольких соответствующих файлов, либо оставив буквальную звездочку.

    Если соответствующих файлов нет, lsсообщит об ошибке, что не может найти файл/apps/oracle/home/DB_1201/*.dmp(со звездочкой в ​​качестве первого символа имени файла ). В качестве побочного эффекта он не выведет файлы на wc -l, и вы получите нуль в качестве ожидаемого и правильного результата.

    Наконец, тест сопоставит либо нулевые файлы вместе с ошибкой, записанной в stderr , либо некоторое не-нулевое количество файлов.

    В качестве пункта современного кодирования рассмотрите возможность замены [ `command` ]на [ "$(command)" ]. Или, если вы пишете для bash,[[ "$(command)" ]]

  2. exit -9991

    Коды выхода должны быть либо 0 (успех, хорошо ), либо находиться в диапазоне 1 -127.Использование больших или отрицательных чисел ошибочно и вводит в заблуждение

    .
  3. if [ $? != 0 ]

    Вы используете сравнение строк для числовых значений. На практике это, вероятно, нормально, но вместо этого вы должны использовать [ $? -ne 0 ]или [ $? -gt 0 ].

  4. if scp -rp /apps/oracle/home/DB_1201/*dmp oracle @ v0021x91:/apps/oracle/home/DB_1201/*dmp

    • Что с пробелами в целевом компоненте?
    • Не указывайте подстановочные знаки в цели, если вы действительно действительно не знаете, что делаете

    Почти навернякаoracle@v0021x91:/apps/oracle/home/dB_1202/

  5. if ssh v0021x91 ls /apps/oracle/home/DB_1201/*.dmp

    Подобно #1, вы получите сообщение об ошибке, если на удаленном компьютере нет файлов, соответствующих *.dmp, и непредвиденные проблемы, если на локальном есть один или несколько файлов, соответствующих этому пути машина.

Чтобы избежать расширения подстановочных знаков в локальной системе, заключайте в кавычки команду, которую вы передаете ssh. Так что для #5 вы должны написать if ssh v0021x91 'ls /apps/oracle/home/DB_1201/*.dmp'и т. д.

1
18.03.2021, 23:11

Единственное, что не так с вашим первым фрагментом кода, это то, что единственный удаленную команду 'ls' необходимо заключить в кавычки, чтобы отложить выполнение шаблона глобуса. Ваш основной подход звук; согласно справочной странице SSH, статус выхода ssh command — это код выхода удаленной команды.

Кроме того, статус выхода ограничен диапазоном 0 -255

Попробуйте это:

if ssh v0021x91 'ls /apps/oracle/home/DB_1201/*.dmp'
    then
      echo "Files still exist after cleanup"
      exit 1
    else
      echo "Files cleaned up"
   fi
0
18.03.2021, 23:11

Теги

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