Похоже, вы ожидаете, что "hello"
будет передано сценарию в качестве аргумента, но не передаете его в качестве аргумента командной строки оболочке.
Вместо этого, чтобы передать скрипт на стандартный ввод в bash
, используйте bash -s
. Это также позволяет вам передавать дополнительный аргумент командной строки, например.bash -s "hello"
:
ssh...options... 'sudo -u remoteuser /bin/bash -s "hello"' <./hello.sh
Обратите внимание, однако, что это делает стандартный поток ввода оболочки сценарием оболочки, поэтому чтение данных из стандартного ввода становится затруднительным внутри самого сценария.
Очевидно, что другой вариант — передать сценарий на удаленную систему и запустить его там.
Ваша команда
ssh...options... 'sudo -u remoteuser /bin/bash' <./hello.sh "hello"
идентично
ssh...options... 'sudo -u remoteuser /bin/bash' "hello" <./hello.sh
Позиционирование перенаправления на линии здесь не имеет значения. См., например. Насколько допустима эта команда? "> файл1
Основываясь на информации, которую я нашел в этом сообщении в блоге Red Hat , я думаю, что понимаю цель. (Я не специалист по сетям Linux, поэтому, если кто-то более знающий заметит какие-либо ошибки, не стесняйтесь поправлять меня в комментариях или опубликовать свой собственный ответ.)
Сначала немного предыстории:
Устройство sit
— это тип виртуального сетевого устройства, которое принимает ваш трафик IPv6, инкапсулирует/декапсулирует его в пакеты IPv4 и отправляет/получает его через Интернет IPv4 на другой хост (, например. ваш брокер туннелей IPv6 ). Внешние пакеты имеют специальный номер протокола :41. (Это похоже на номер порта, но на уровне IP, а не на уровне TCP/UDP.)
Отправка выполняется достаточно просто. :Устройство sit
имеет связанные с ним локальный и удаленный IPv4-адреса, которые становятся исходным и целевым адресами во внешнем заголовке IPv4. (Адрес источника также может быть «любым» или 0.0.0.0, и в этом случае Linux выберет для вас адрес источника на основе интерфейса IPv4, с которого отправляется инкапсулированный пакет.)
Получение лишь немного сложнее. :Когда приходит пакет протокола 41, Linux необходимо определить, sit
какому устройству он принадлежит. Для этого он просматривает внешние IPv4-адреса источника и получателя пакета. Он сравнивает их с локальными и удаленными адресами для каждого sit
устройства, и тот, который совпадает, является устройством, которое получает пакет и декапсулирует его.
Как sit0
вступает в игру:
Вам может быть интересно, что происходит, когда Linux получает пакет протокола 41, который не соответствует ни одному из sit
устройств (, например. оно пришло с какого-то случайного адреса ). В этом случае он доставляется sit0
.
sit0
— это специальное «запасное» устройство, настроенное модулем ядра sit
для обработки только этих пакетов. У него есть локальный и удаленный адреса, установленные на 0.0.0.0 (, т.е.«любой» ), и он не привязан ни к какому конкретному физическому устройству, поэтому он будет принимать любой пакет протокола 41, который еще не обработан каким-либо другим sit
устройством.
Это полезно? Возможно, в определенных обстоятельствах, но я предполагаю, что в подавляющем большинстве случаев вы захотите отбросить такие пакеты. Я не уверен, почему администратор не решает, следует ли создавать такое перехватывающее -все устройство. Возможно, есть какая-то историческая причина.