Почему при экспорте переменной в оболочке ssh выводится список экспортируемых переменных?

Вы можете использовать airmon-ng, только если у вас есть отдельный USB WiFi адаптер! Это очень важно, без него невозможно использовать airmon-ng.

17
12.01.2017, 00:25
2 ответа

Когда вы запускаете команду через ssh , она запускается путем вызова вашего $ SHELL с флагом -c :

-c    If the -c option is present, then commands are read from 
      the first non-option argument command_string.  If there  are
      arguments  after the command_string, the first argument is 
      assigned to $0 and any remaining arguments are assigned to
      the positional parameters.  

Итак, ssh remote_host "bash -c foo" действительно будет запущен:

/bin/your_shell -c 'bash -c foo'

Теперь, поскольку команда, которую вы выполняете ( export foo = bar ), содержит пробелы и неправильно цитируется для формирования целого , экспорт принимается как команда для выполнения, а остальные сохраняются в массиве позиционных параметров. Это означает, что выполняется export , и foo = bar передается ему как $ 0 . Конечный результат такой же, как при выполнении

/bin/your_shell -c 'bash -c export'

. Правильная команда:

ssh remote_host "bash -c 'export foo=bar'"
31
27.01.2020, 19:46

ssh объединяет аргументы с пробелами и интерпретирует их оболочкой входа в систему удаленного пользователя, поэтому в:

ssh localhost bash -c 'export foo=bar'

ssh запрашивает удаленную оболочку интерпретировать команду

bash -c export foo=bar

(фактически, если удаленный хост является Unix-подобным, он будет запускать удаленную оболочку с аргументами the-shell , -c и bash -c export foo = bar ).

Большинство оболочек интерпретируют эту командную строку как выполнение команды bash с bash , -c , export и foo = bar в качестве аргументов (так что запустите export , а $ 0 содержит foo = bar ), тогда как вы хотите, чтобы он запускал его с bash , -c и экспортируют foo = bar в качестве аргументов.

Для этого вам нужно будет использовать командную строку, например:

ssh localhost "bash -c 'export foo=bar'"

(или:

ssh localhost bash -c \'export foo=bar\'

, если это важно), чтобы командная строка:

bash -c 'export foo=bar'

передавалась удаленной оболочке. Эта командная строка будет интерпретироваться большинством оболочек как выполнение команды bash с bash , -c и export foo = bar в качестве аргументов. . Обратите внимание, что использование

ssh localhost 'bash -c "export foo=bar"'

не будет работать, если оболочка входа удаленного пользователя была rc или es , например, где " не является специальным оператором цитирования.Одиночные кавычки являются наиболее переносимыми операторами цитирования (хотя есть некоторые различия в их интерпретации между оболочками, см. Как выполнить произвольную простую команду через ssh, не зная оболочки входа удаленного пользователя? для получения дополнительной информации. на что).

9
27.01.2020, 19:46

Теги

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