Странное поведение 'sh -c' при запуске через ssh [дубликат]

Если вы посмотрите формальную документацию библиотеки Python JSON, вы увидите, что вызов json.tool должен быть python -mjson.tool . Это означает, что программа в файле tool.py в каталоге json вашей установки python или что она находится в файле __ init __. Py в каталоге Каталог инструмента в json в вашей установке python.

На самом деле файл является первым из двух, а его функция main () содержит <20 строк кода, которые можно легко проанализировать:

  • если нет аргументов, он работает как конвейер: JSON in и JSON out
  • , если есть один аргумент, который принимается как входной файл JSON, вывод на stdout
  • есть два аргумента: первый - это входной файл JSON, второй - выходной файл JSON

Если вы предоставите больше параметров он фактически покажет использование:

$ python -m json.tool a b c
/opt/python/2.7.11/lib/python2.7/json/tool.py [infile [outfile]]

Это для версии 2.7 инструмента. Версия 3.5.1 имеет дополнительный параметр, и там параметры отображаются, если вы используете -h :

$ python -m json.tool -h

usage: python -m json.tool [-h] [--sort-keys] [infile] [outfile]

A simple command line interface for json module to validate and pretty-print
JSON objects.

positional arguments:
  infile       a JSON file to be validated or pretty-printed
  outfile      write the output of infile to outfile

optional arguments:
  -h, --help   show this help message and exit
  --sort-keys  sort the output of dictionaries alphabetically by key
3
21.12.2017, 01:14
1 ответ

Здесь происходит пара разных нелогичных вещей.

Прежде всего, ваша команда удаленному хосту анализируется как

(sh -c echo starting); who -b; date; echo $SHELL

Внешние кавычки удаляются, оставляя вам только запуск эха , запускаемый в sh , поэтому $ SHELL имеет значение / bin / bash .

Во-вторых, «запуск» не печатается по причинам, указанным в этом ответе: https://unix.stackexchange.com/a/253424

Однако вы можете решить обе эти проблемы, просто заключая команду в другой набор кавычек, оставляя вас с

ssh myhost sh -c '"echo starting; who -b ; date; echo $SHELL"'

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

ssh myhost 'sh -c "echo starting; who -b ; date; echo $SHELL"'
8
27.01.2020, 21:12

Теги

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