Это, вероятно, самая запутанная и раздражающая вещь при работе с ssh (по крайней мере, на мой взгляд).
Причина такого поведения в том, что ssh не сохраняет аргументы при выполнении удаленной команды. Он берет все ваши аргументы и объединяет их вместе, разделенные пробелами.
Итак, когда вы запускаете
ssh remote sh -c 'echo hi > hi.txt'
Фактически, вы выполняете следующее:
ssh remote 'sh -c echo hi > hi.txt'
Это запускает sh -c echo
, передает оболочку ( не echo
) аргумент hi
(который не используется) и перенаправляет вывод на hi.txt
.
Решение, предлагаемое chthonous (вложенное цитирование), является одним из способов решения этой проблемы. Давайте посмотрим на это:
ssh remote sh -c '"echo hi > hi.txt"'
Здесь происходит то, что ssh объединяет все аргументы, поэтому вы фактически получаете:
ssh remote 'sh -c "echo hi > hi.txt"'
"но я теряю информацию о форматировании, которую я хотел бы сохранить."
Дело не в том, что он думает, что ты не на tty, а в том, что он думает, что ты на [1130419] действительно старом [1130420] tty, который переигрывает трюки через [1130421] grotty[1130422], бэк-энд-процессор groff. Из man page:
[HKEY_CURRENT_USER\Control Panel\Desktop]
"DragHeight"="4"
"DragWidth"="4"
Используйте переключатель -c для возврата к старому поведению, распечатав жирный символ c с последовательностью 'c BACKSPACE c' и курсив c последовательностью '_ BACKSPACE c'. В то же время цветной вывод отключен. Аналогичного эффекта можно добиться, установив либо переменную окружения GROFF_NO_SGR, либо команду 'sgr' X (см. ниже).
Проблема в том, что вы не хотите, чтобы [1130425]-c[1130426] или [1130427]GROFF_NO_SGR[1130428] были установлены, но по какой-то причине думаете, что это один или оба.
Проверьте свое окружение на наличие [1130429]GROFF*[1130430], а переменную [1130431]TERM[1130432] - на наличие вменяемых значений.[1130073].