Nano Hash - криптовалюты, майнинг, программирование

Код выхода удаленной команды SSH

Я знаю, что об этом много дискуссий, но мне нужна ваша помощь с кодами выхода удаленной команды ssh. У меня есть этот код: (scan — это скрипт, который сканирует данный файл на наличие вирусов)

for i in $FILES 
do
    RET_CODE=$(ssh $SSH_OPT $HOST "scan $i; echo $?")
    if [ $? -eq 0 ]; then
        SOME_CODE

Сканирование работает и возвращает либо 0, либо (1 для ошибок), либо 2, если обнаружен вирус. Но каким-то образом мой код возврата всегда равен 0. Даже если я сканирую вирус.

Вот вывод set -x:

++ ssh -i /home/USER/.ssh/id host 'scan Downloads/eicar.com; echo 0'
+ RET_CODE='File Downloads/eicar.com: VIRUS: Virus found.
    code of the Eicar-Test-Signature virus
0'

Вот вывод, если я запускаю эти команды на «удаленном» компьютере без ssh:

[user@ws ~]$ scan eicar.com; echo $?
File eicar.com: VIRUS: Virus found.
    code of the Eicar-Test-Signature virus
2

Я просто хочу получить код возврата, мне не нужен весь остальной вывод scan.

!ОБНОВИТЬ!

Похоже, проблема в echo.


Ответы:


1

Причина, по которой ваш ssh всегда возвращает 0, заключается в том, что последняя команда echo всегда выполняется успешно! Если вы хотите получить код возврата от scan, либо удалите echo, либо назначьте его переменной и используйте exit. В моей системе:

$ ssh host 'false'
$ echo $?
1
$ ssh host 'false; echo $?'
1
$ echo $?
0
$ ssh host 'false; ret=$?; echo $ret; exit $ret'
1
$ echo $?
1
01.10.2018
  • Во втором примере вы имеете в виду 0 как возвращаемое значение? 01.10.2018
  • Да, ложно; эхо $?' имеет выходное значение 0, потому что это значение исходит из (успешной) команды echo. Однако значение echo равно 1, потому что оно исходит из команды false. 02.10.2018
  • Хорошо, тогда я неправильно понял свой собственный сценарий. Теперь скрипт останавливается после выполненного кода, потому что в выводе, я думаю, есть новая строка. Это тоже exit 0, если я перенаправлю вывод на /dev/null? 02.10.2018
  • Выходное значение не изменится, если вы перенаправите вывод. 02.10.2018

  • 2

    ssh возвращает статус выхода всего запущенного конвейера — в данном случае это статус выхода echo $?.

    То, что вы хотите сделать, это просто использовать результат ssh напрямую (поскольку вы говорите, что вам не нужен вывод):

    for i in $FILES 
    do
        if ssh $SSH_OPT $HOST "scan $i >/dev/lull 2>&1"
        then
            SOME_CODE
    

    Если вы действительно чувствуете, что должны напечатать код возврата, вы можете сделать это, не влияя на общий результат, используя ловушку EXIT:

    for i in $FILES 
    do
        if ssh $SSH_OPT $HOST "trap 'echo \$?' EXIT; scan $i >/dev/lull 2>&1"
        then
            SOME_CODE
    

    Демо:

    $ ssh $host "trap 'echo \$?' EXIT; true"; echo $?
    0
    0
    $ ssh $host "trap 'echo \$?' EXIT; false"; echo $?
    1
    1
    

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

    02.10.2018
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..