Можно ли передать файл в heredoc в bash?

Я могу заархивировать файл, загрузить его и развернуть в каталог на сервере следующим образом:

tar -pzcf - example.txt | ssh [email protected] 'cd /some-path/ && tar -zxf -'

Можно ли сделать то же самое с heredoc? Что-то вроде следующего (что не работает):

tar -pzcf - example.txt | ssh [email protected] /bin/bash <<EOF
    cd /some-path/
    tar -zxf -
EOF

Обоснование: у меня есть несколько локальных скриптов, которые я запускаю через SSH на двух серверах, которые по-разному обрабатывают кавычки , и heredoc исправляет эту проблему. Тем не менее, некоторые скрипты передают файлы по конвейеру на сервер, чтобы я мог следить за прогрессом, и мне не удалось найти способ передать содержимое локального файла в pv, а затем в выражение heredoc. чтобы я мог манипулировать этим файлом на сервере (как я могу без heredoc).

РЕДАКТИРОВАТЬ

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

root_path=`jq -r '.config.path.remote' config.json`
tar -pzcf - example.txt | ssh [email protected] "cd '$root_path' && tar -zxf -"

и (опять же не работает, но расширение работает):

root_path=`jq -r '.config.path.remote' config.json`
tar -pzcf - example.txt | ssh [email protected] /bin/bash <<EOF
    cd "$root_path"
    tar -zxf -
EOF

Документ здесь обрабатывается в локальной системе, а не в удаленной системе. Он предоставляет входные данные для локальной команды tar, но не читает со стандартного ввода.

Barmar 19.04.2024 00:07

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

Charles Duffy 19.04.2024 00:14

теперь, если у вас была нормальная оболочка, мы могли бы скопировать исходный стандартный ввод в другой файловый диск перед настройкой удаленного heredoc, но поскольку все это вступило в игру из-за того, что у вас необычная оболочка, все ставки сняты, если мы не сможем идентифицировать эту оболочку, чтобы рассуждать о ее конкретном поведении.

Charles Duffy 19.04.2024 00:18

...кстати, пробовали ли вы проверить систему с нетипичным поведением, чтобы попытаться выяснить основную причину? Есть ли успех в этих усилиях?

Charles Duffy 19.04.2024 00:20

Если проблема связана с кавычками, почему возникают проблемы с исходной командой? В команде, которую вы отправляете по SSH, нет кавычек.

Barmar 19.04.2024 01:38

@Barmar выше — это упрощенная версия: в реальном сценарии я читаю значения как переменные из файла конфигурации .json (например, «/some-path/» — это переменная с корневым каталогом сервера в ней).

Tomas Mulder 19.04.2024 17:09

@CharlesDuffy, система с нетипичным поведением является стандартным хостом WP Engine, поэтому я, вероятно, мало что могу сделать, чтобы они что-то изменили, но мне интересно, почему они удаляют кавычки таким странным образом.

Tomas Mulder 19.04.2024 17:21

Стоит это выяснить. Если они передают контент напрямую в оболочку, мы можем выяснить, каково поведение этой оболочки. Если они используют какой-то собственный код, чтобы попытаться выполнить синтаксический анализ в стиле оболочки (возможно, как попытка найти команды, отправленные обычным вредоносным ПО или чем-то подобным — экосистема WordPress является популярной целью атак), прежде чем контент будет передан фактическому оболочка... ну, опять же, мы не сможем найти хорошее обходное решение, пока не будем точно знать, над чем работаем.

Charles Duffy 19.04.2024 17:29

Зачастую файлы sshd_config доступны для чтения всем — если в них есть ForceCommand, вы сможете прочитать их даже из своей непривилегированной учетной записи пользователя.

Charles Duffy 19.04.2024 17:29

Кстати, если у вас есть правильный ответ на вопрос, который был задан при написании этого ответа, неправильно редактировать вопрос таким образом, чтобы сделать ответ недействительным позже (здесь вы можете найти людей, ссылающихся на вопросы, которые изменяются таким образом. способы как «вопросы-хамелеоны»). Нажмите кнопку «Принять» и задайте новый вопрос для нового случая.

Charles Duffy 19.04.2024 17:40

Если бы ваша удаленная оболочка была bash (а ваша локальная оболочка была bash 5.0 или новее), я бы предложил tar -pzcf - example.txt | ssh [email protected] "cd ${root_path@Q} && tar -zxf -". Или, лучше, tar -pzcf - example.txt | ssh [email protected] "tar -C ${root_path@Q} -xzf -"

Charles Duffy 19.04.2024 17:42

Кстати, если вы добавите set -x; к удаленной команде, например, tar -pzcf - example.txt | ssh [email protected] "set -x; tar -C ${root_path@Q} -xzf -", это будет считаться честью? (Это должно привести к тому, что удаленная оболочка напечатает сообщение журнала с описанием переданных ей аргументов tar).

Charles Duffy 19.04.2024 17:44
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
12
75
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как указано в комментарии, вы не можете иметь два разных стандартных ввода. Если оболочка получает свой стандартный ввод из здесь-документа, она не сможет передать SSH-соединение в качестве стандартного ввода команде tar.

Вам не нужно отправлять cd и tar как отдельную команду, разделенную &&. Вы можете использовать опцию -C, чтобы tar автоматически менял каталог. Эта опция есть как в GNU tar, так и в BSD tar, хотя ее нет в спецификации POSIX.

При этом кавычки вообще не нужны (если в пути, на который вы меняете, нет пробелов).

tar -pzcf - example.txt | ssh [email protected] tar -C /some-path/ -zxf -

Я не уверен, что первый вариант будет работать так, как написано сейчас: вы запускаете bash со стандартным вводом, подключенным к временному файлу с содержимым heredoc. Как tar получит дескриптор файла на исходном стандартном вводе? Если вы сохранили копию исходного fd, это должно сработать, но у IIRC у ОП был предыдущий вопрос, подразумевающий, что их удаленная оболочка по умолчанию была чем-то необычным и удивительным для подмножества систем, на которых им нужно было иметь возможность запускать код.

Charles Duffy 19.04.2024 00:15

О, ты прав!

Barmar 19.04.2024 00:16

Так что им, вероятно, нужно ssh server bash -c 'cd blah && tar -zxf -'

Barmar 19.04.2024 00:17

Перефразируя Барби: «Распределенные вычисления — это сложно!»

Barmar 19.04.2024 00:19

кивок. Если это GNU tar, они могут даже отказаться от cd и использовать tar -C blah -xzf -.

Charles Duffy 19.04.2024 00:19

BSD (например, MacOS) tar также имеет это, так что, вероятно, большинство tar в дикой природе. Хотя, если оболочка по умолчанию несовместима с его исходной командой, кто знает, какой у нее tar?

Barmar 19.04.2024 00:24

Я бы, наверное, пропустил здесь bash -c; Целью явного запуска bash было получение хорошо понятного парсера, но поскольку мы не знаем, что такое внешняя оболочка (но знаем, что она не POSIX-y), и поэтому не можем надежно создавать кавычки, предназначенные для получения данные, проходящие через него, возможно, будут лучше, если команда будет максимально простой (не зависящей ни от чего, кроме разделения на пробелы).

Charles Duffy 19.04.2024 01:34

Тогда мы, по сути, вернулись к исходной команде, за исключением того, что мы заменили cd blah && tar на tar -C blah.

Barmar 19.04.2024 01:37

Но я упростил результат вот так.

Barmar 19.04.2024 01:41

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

Charles Duffy 19.04.2024 03:05

Существует множество вариантов использования sudo и ssh, при которых может быть чрезвычайно сложно правильно выполнить цитирование и экранирование (худшим может быть сочетание ssh hostname sudo ...). Я, вероятно, разместил ответ в Unix & Linux, где решением был документ здесь. Я обычно рекомендую скопировать скрипт на пульт, а затем выполнить его по ssh, а не пытаться все объединить. К сожалению, обычно говорят, что это невозможно.

Barmar 19.04.2024 17:10

Когда удаленная оболочка — bash, я считаю ssh somehost "$(declare -f funcname); $(declare -p var1 var2 var3); funcname" вполне надежным решением (при условии, что функция funcname зависит от переменных var1, var2 и var3).

Charles Duffy 19.04.2024 17:19

Другие вопросы по теме