Не удается подключиться по SSH к экземпляру Debian после назначения статического IP

Честно , я совершенно уверен, что нет проблемы, которую лучше было бы решить, выполнив что-то другое, кроме явного вызова внешнего двоичного файла (особенно при поиске конкретной реализации внешнего двоичного файла).

Так как я обычно ненавижу ответы, которые сводятся к «тебе никогда не нужно делать то, что ты хочешь сделать», здесь я делаю исключение.Вместо этого я предложу многочисленные альтернативы в порядке их убедительности. Если вам абсолютно необходимо найти правильный двоичный файл echo, у Майкла Гомера есть наиболее подходящий ответ, и вам также следует прочитать ответ Стефана Шазела, потому что он вызывает несколько мест в файловой системе, которые вы, возможно, не ожидаете. найти двоичные файлы echo. У меня также есть некоторые дополнительные предостережения о поиске «правильного» эха в моем последнем разделе этого ответа.

printf

Я никогда не видел системы, предназначенной для реального запуска пользовательских сценариев оболочки и реально использовавшейся за последние пару десятилетий, которая не поставлялась с printf. Я, конечно, никогда не видел системы, которая хотя бы близко включала что-то такое большое, как GNU coreutils, которая не поставлялась с printf из коробки.

Для перспективы, я до такой степени одержим переносимостью сценариев оболочки, и у меня есть доступ буквально только к двум системам с Bourne-подобной оболочкой, которые не имеют printf: виртуализированный Unix v7 (да, тот, что был четыре десятилетия назад или около того) и одно (из примерно пяти имеющихся у меня) Android-устройство, на котором в основном ничего не установлено и поэтому заблокировано. down, в любом случае в ближайшее время он не будет запускать какие-либо полезные сценарии оболочки.

Это напечатает вашу строку exact на — я обещаю — на каждой системе, которая заслуживает использования кем-либо в наше время:

printf '%s' "$my_var_holding_my_text"

и

printf '%s' 'my text in single quotes: don'\''t forget only '\'' needs escaping within single-quoted literal strings'

, ЕСЛИ вам также не нужно распечатать null байт.Сомневаюсь, что вам это нужно. Если вы это сделаете, вы не сможете использовать весь текст как один аргумент для printf в любом случае, так как большинство оболочек (zsh заслуживает похвалы здесь) используют нулевые байты как терминаторы строк. Таким образом, вы должны использовать \000 восьмеричные escape-последовательности в строке формата (первый аргумент) и комбинировать их с нулем или более %s и нулем или более дополнительными аргументами для печати всех остальных текст. Насколько я знаю, шестнадцатеричные экраны (вместо восьмеричных) и другие приемы менее переносимы.

Предложение: не помещайте ничего, которое вам не нужно специально анализировать/преобразовывать в строку формата. Различные реализации printf поддерживают немного отличающееся форматирование (включая современные реализации printf, например, встроенный bash против busybox printf).

Если вы хотите, чтобы к выходным данным добавлялся дополнительный символ новой строки, добавить в строку формата дополнительную \n тривиально:

printf '%s\n' foo

является строго однозначным/работает везде одинаково эквивалентно

echo foo

Если вы столкнулись с запутанной ситуацией, в которой непросто создать нужную строку формата (помните, что строку формата можно построить и программно, используя переменные), вы всегда можете включить литерал новой строки в аргументы, которые вы передаете printf, или выводить символы новой строки сами по себе с голым echo без аргументов отдельно.

Здесь-файлы, или: cat <

cat <<DELIMITER
$my_variable_containing_my_text
DELIMITER

или

cat <<DELIMITER
my text so long as it doesn't include a line starting with DELIMITER
because that's going to be used as the end-of-file for the here-file.
$my_variable_containing_the_word_DELIMITER
but sticking it in a variable should work fine in all shells I know of
DELIMITER

Одно предостережение заключается в том, что вы не можете контролировать, получаете ли вы новую строку в конце или нет: вы всегда будете получить новую строку в конце. В большинстве случаев это, вероятно, то, что вы хотели, или это не имеет значения. Кроме того, многие (все?)шеллы используют временные файлы на диске для реализации here-файлов, так что можно нарваться на ситуацию, когда сильно ограниченная система этого не позволяет (такой же до неприличия покалеченный инстанс Android без printf у меня тоже стоит SELinux политики или какие-то другие ограничения разрешений (точно не помню), которые не позволяют оболочке создавать временные файлы).

Из-за этого, по соображениям компьютерной безопасности, если вам нужно напечатать конфиденциальную информацию, здесь-файл может быть хуже или лучше, чем эхо, в зависимости от конкретной системы (это echo внешний или встроенный? Является ли файл /proc/$PID доступным для чтения всем пользователям или пользователям? Доступны ли здесь файлы для чтения пользователем или всем пользователям?) и ваша точная модель угрозы (угроза с большей вероятностью будет искать ваш диск в судебном порядке? чем информация о запущенном процессе?)

expr

Малоизвестная особенность expr заключается в том, что она может извлекать и печатать подстроки из аргумента с совпадением регулярного выражения. По сути, это более переносимая версия исходного поведения echo (печать содержимого дословно и один символ новой строки) и даже более переносимый способ печати простого текста, чем printf:

expr X"$my_var_holding_my_text" : 'X\(.*\)'

и

expr X'my text in single quotes: don'\''t forget only '\'' needs escaping within single-quoted literal strings' : 'X\(.*\)'

Это работает обратно в Unix v7.X в начале как строки/переменной для печати , так и в начале регулярного выражения снаружи из \( \) совпадение/выбор подшаблона важно: первый предохраняет печатаемое значение от неправильной интерпретации командой expr как ключевое слово expr, а второй затем делает убедитесь, что X на самом деле не напечатан.

awk

Вот компактный awk однострочник, который выводит большинство однострочных аргументов, которые он получает однозначно (у вас все еще будут проблемы с обратной косой чертой в более поздней версии awk - спасибо Стефану за напоминание об этом в комментариях):

: | awk 'BEGIN { ORS="" } END { print v }' v="$my_var_with_my_string"

Это работает с Unix v7. Если у вас нет обратной косой черты, это чрезвычайно переносимо и может быть достаточно для текста, который вам нужно вывести. Вы также можете обнаружить, что написание функциональных тестов для различных реализаций awk в ваших скриптах проще/проще/чище, чем заставить echo работать на вас, поскольку, хотя среди определенно много отклонений awks, есть меньше вариантов для тестирования, чем echo, если ваша основная цель — просто написать какой-то точный вывод.

Очевидно, что используйте технику одинарных кавычек, если вы хотите использовать литерал вместо переменной.Выполните echo без аргументов, если вы хотите, чтобы после него была новая строка (или найдите время, чтобы тщательно проверить конкретный способ, обеспечивающий печать новой строки командой awk — я предлагаю заменить : no-op команда слева от конвейера с echo без аргументов, но я тщательно не проверял эту идею на предмет универсальной переносимости)..

echo передается через sed или аналогичный

Если вы знаете, что ваши входные данные не являются специальными (нет восьмеричных символов с обратной косой чертой, таких как \000 во входных данных, которые вы хотите напечатать буквально, и вам нужно просто избегать специального разбора символа -, например, вы хотите напечатать -e, вы все равно можете заставить произвольное echo работать на вас, если у вас есть что-то еще, что вы можете использовать для предварительной обработки вывода echo:

echo X-e | sed '1 s/^X//'

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

Feature-test echo

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

Вы особенно выразили озабоченность по поводу надежной печати символов -. К сожалению, я еще не написал подробного echo-функции-тестирующего фрагмента сценария оболочки, но вот несколько базовых фрагментов, которые приходят мне в голову:

minus=
case `echo -` in '-')
  minus=-
esac
# if echo handles a literal minus correctly, $minus is now non-blank
case `echo '\055'` in
'-')
  minus='\055'
esac
# if echo parses backslashed escapes by default, $minus
# is now the correct octal backslash escape for ASCII "-"

Вы можете создать аналогичные тесты. для конкретных вещей: echo -e '\055' (должен выводиться либо -e \055, либо -), echo -E '\055 ' (если он анализирует символы обратной косой черты по умолчанию, и вы хотите попробовать отключить их) и т. д.

Многие современные экземпляры echo будут анализировать другие символы обратной косой черты, а не восьмеричные числа, но вы можете специально протестировать функцию для тех (echo '\x2d' или что-то еще) - но я думаю, что в большинстве случаеввы действительно просто хотите найти набор аргументов, которые вы можете передать эху, чтобы заставить его печатать что-то без специальных замен содержимого, а затем передать ему вывод, который вы хотите дословно.

В зависимости от ваших потребностей, echo -n также может быть полезно протестировать, но имейте в виду, что подстановка команд всегда удаляет последнюю новую строку (только последнюю в большинстве случаев). оболочки, но все завершающие символы новой строки в некоторых оболочках), поэтому два возможных варианта вывода — это литерал -n и пустая строка.

Вы также можете обратиться к источникам autoconf и m4, потому что я думаю, что эти инструменты изо всех сил стараются найти эхо-сигнал, который они могут использовать для однозначной печати, если они могут не могу найти printf или что-то еще, что работает.

Буквально что-нибудь еще

Я искренне думаю, что почти все, что не зависит от того, что вам придется искать в точности правильное эхо методом грубой силы, будет лучшим. Крайне вероятно, что конкретное echo не будет установлено, или не будет установлено там, куда вы смотрите, или что автоматический перебор, начинающийся с /, приведет к падению системы какого-нибудь бедолаги. к ползанию.

И хотя это очень маловероятно, вполне возможно, что двоичный файл передаст ваши отпечатки пальцев как GNU coreutils echo, но будет иметь отличие в поведении: даже если GNU никогда не изменит свою реализацию, кто-то может обернуть свою собственную установленную версию GNU echo, чтобы не делать то, что они считают глупым поведением (прозрачная передача всех аргументов, кроме молчаливого удаления тех, которые являются особыми, при установке тех, которые они хотят, тривиальна в оболочки, так что вы легко можете заставить echo --help напечатать правильный текст, но echo -e '\055' сделает не то). И нет, даже двоичный файл, прошедший тщательную проверку подлинности, не является достоверным: я уже редактировал необработанные двоичные файлы ELF, чтобы изменить поведение, и я сделаю это снова. Иногда это нужно для того, чтобы включить очень полезную функциональность (не удалять сообщения, содержащие не-ASCII-байты, такие как смайлики Unicode, в программном обеспечении для обмена сообщениями с закрытым исходным кодом), а иногда для действительно мелких вещей, таких как изменение жестко заданного значения по умолчанию PS1 в оболочках. быть \$\ вместо \w \$). Лично у меня нет достаточной причины делать это с echo, потому что в системах, которые я действительно использую, я просто игнорирую echo почти для всей серьезной работы, но кому-то другому может показаться, что строго относится к поведению echo по умолчанию, как я отношусь к значениям переменных PS1 по умолчанию. Итак, вы вернулись к тестированию функций echo, после чего см. раздел выше.

Кроме того, обратите внимание, что у меня есть системы, в которых GNU coreutils echo установлен как gecho, поэтому неэффективный поиск PATH и возможных мест установки , ни прямой поиск только файлов с именами echo не обнаружит эти системы.

И я готов поспорить, что на большем количестве систем установлен какой-либо язык сценариев, такой как perl, который может делать то, что вы хотите, чем в системах с GNU coreutils echo. : некоторые языки сценариев распространены повсеместно и в основном имеют одну реализацию или четко определенную спецификацию, в то время как echo реализаций существует множество и они следуют ровно одной спецификации: «делать что-то, немного отличающееся от многих других echo реализации, насколько это возможно».

1
10.01.2017, 19:35
1 ответ

Включено для потомков, если кто-нибудь найдет это в Google:

Проблема не имела ничего общего с сетевой конфигурацией на коробке; За последние два месяца Verizon ввел в действие политику блокировки входящих подключений к устройствам M2M. Если вам нужен удаленный доступ к устройству через сотовую связь, вам нужно будет работать с Verizon, чтобы настроить частную сеть.

0
28.01.2020, 01:04

Теги

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