SSH сессия - почему цикл bash FOR даже не показывает значение, а также использует локальный компьютер - PullRequest
0 голосов
/ 23 января 2019

Я запускаю эту команду SSH:

ssh -p 2001 -q root@12.13.14.15 \
  " echo
    echo Now On Target Server, I see
    ls -l /tmp/Folder-1.1.0.1053/*
    for v in A B C ; do
      echo === $v===
    done
    echo
    for f in /tmp/Folder-1.1.0.1053/* ; do
      echo File is == $f
    done
  "

и печатает это:

Now On Target Server, I see
-rw------- 1 root root 159790 Jan 23 17:03 /tmp/Folder-1.1.0.1053/file1-1.8.30.tar.gz
-rw------- 1 root root 116731 Jan 23 17:03 /tmp/Folder-1.1.0.1053/file2-2.7.49.tar.gz
=== ===
=== ===
=== ===

File is ==
File is ==

У меня есть несколько вопросов:

  1. Почемупервый цикл for не печатает значения переменной $v?
  2. Почему (когда я вижу, что на целевом сервере есть действительные файлы в /tmp/<folder>), второй цикл for не печаталзначения переменной $f?
  3. Как получить второй цикл for для печати двух .tar.gz файлов?
  4. Я пытался $(...) или использовать обратные кавычки дляоберните входные значения (для цикла for) во второй цикл for, но это не имеет никакого эффекта.По некоторым причинам они ожидают эти * файлы, используя локальную машину.Почему?

Если это уместно, моя версия Bash - "GNU bash, версия 4.1.2 (1) -релиз (x86_64-redhat-linux-gnu)", а моя версия Linux - "Red"Hat Enterprise Linux Server, версия 6.9 (Сантьяго) ".

1 Ответ

0 голосов
/ 23 января 2019

Поскольку ваша команда ssh заключена в двойные кавычки, все ваши переменные $ интерполируются локальной оболочкой, прежде чем переходить к удаленной оболочке. Либо используйте одинарные кавычки, либо избегайте своих $ сигил.

Ex:

ssh -p 2001 -q root@12.13.14.15 "echo; echo Now On Target Server, I see; ls -l /tmp/Folder-1.1.0.1053/*; for v in A B C; do echo === \$v===; done; echo; for f in /tmp/Folder-1.1.0.1053/*; do echo File is == \$f; done"

или

ssh -p 2001 -q root@12.13.14.15 'echo; echo Now On Target Server, I see; ls -l /tmp/Folder-1.1.0.1053/*; for v in A B C; do echo === $v===; done; echo; for f in /tmp/Folder-1.1.0.1053/*; do echo File is == $f; done'

См. Очень важное примечание ниже. Экранируйте только переменную, созданную и используемую в сеансе SSH (например, здесь: for loop) или любую другую, где находится внутри сеанса SSH. НЕ экранируйте переменную, которая была определена в вашем скрипте и вне сеанса SSH, например: как используется в части команда / ввод в цикле for. то есть for v in ${staging_area}/*.tar.gz; do echo ==\$v;done" здесь я сбежал \$v но не сбежал ${staging_area}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...