как использовать regex в псевдониме?

Вы хотите механизм внесения неисправности для ввода-вывода.

На Linux вот метод, который не требует никакой предшествующей установки и генерирует необычную ошибку (не EIO “ошибка ввода/вывода”, но ESRCH “Никакой такой процесс”):

cat /proc/1234/mem

где 1234 является PID процесса, работающего как тот же пользователь как процесс, Вы тестируете, но не, которые обрабатывают себя. Кредиты к rubasov для размышления /proc/$pid/mem.

При использовании PID самого процесса Вы получаете EIO, но только если Вы читаете из области, которая не отображается в памяти процесса. Первая страница никогда не отображается, таким образом, хорошо при чтении файла последовательно, но не подходящие для процесса базы данных, который ищет непосредственно на середину файла.

Еще с некоторой установкой как корень можно усилить картопостроитель устройства для создания файлов с допустимыми секторами и поврежденными секторами.

Другой подход должен был бы реализовать маленькую файловую систему FUSE. EIO является кодом ошибки по умолчанию, когда Ваш драйвер файловой системы пространства пользователя делает что-то не так, таким образом, легко достигнуть. И Perl и привязка Python идут с примерами для начала работы, можно быстро записать файловую систему, которая главным образом зеркально отражает существующие файлы, но вводит EIO в тщательно выбранных местах. Существует существующее такая файловая система: petardfs (статья), я не знаю, как хорошо это работает из поля.

Еще один метод LD_PRELOAD обертка. Существующим является Libfiu (внесение неисправности в пространстве пользователя). Это работает путем предварительно загружения библиотеки, которая перегружает вызовы API POSIX. Можно записать простые директивы или произвольный код C для переопределения нормального поведения.

5
02.11.2014, 08:27
5 ответов

Я использую JuJu , который в основном позволяет иметь действительно крошечный дистрибутив Linux (содержащий только менеджер пакетов) внутри каталога $ HOME/.juju.

Это позволяет иметь пользовательскую систему в домашнем каталоге, доступную через proot, и, следовательно, вы можете установить любые пакеты без прав root. Он будет работать правильно для всех основных дистрибутивов Linux, единственным ограничением является то, что JuJu может работать на ядре Linux с минимальной пересчитанной версией 2.6.32.

-121--8640-

Вы можете получить текущую дату в этом формате с помощью:

date +%Y%m%d

, поэтому следующая команда должна найти текущий файл и показать его размер:

ls -l StaticData_Sets_$(date +%Y%m%d)*.txt

или

find . -name "Static_Data_Sets_$(date +%Y%m%d)*.txt" -ls

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

-121--175341-

Это выполнимо - даже с псевдонимом , хотя единственный способ, который я знаю, будет включать eval , который может быть опасным в зависимости от того, что аргументы могут содержать - но не с regex. Реальная проблема здесь токенизация - для каждой простой команды, которую читает оболочка, пытается выполнить любое слово , которое она находит в командной позиции в качестве псевдонима, затем. сбой, как функция/builtin, и, сбой обоих, как исполняемый файл $ PATH . Это упрощение процесса, но оно довольно близко к истине.

Проблема заключается в том, что в одном слове два возможных маркера - ssh - это то, что вы хотите выполнить, а @ $ IP - это аргумент , с помощью которого вы хотите выполнить . Вы можете сделать так, как было предложено в другом месте, и просто разделить маркер на два в сочетании с оболочечной функцией - это просто сделано. Или вы можете получить первый маркер разделить себя .

Интересной вещью в именах shell $ var является то, что они довольно четко определяют, какие символы они могут содержать. Сохраните один особый случай, @ не входит в их число. Если я сделаю:

$var_this_is_appended_to_the_name

Оболочка интерпретирует весь ряд как одно имя переменной, потому что все символы внутри допустимы в имени $ var . Но...

$var@this_is_appended_to_the_name

... приводит к двум маркерам (если не обязательно два слова ) и оболочка расширяется $ var независимо от @ _ rest . Расширение псевдонимов, к сожалению, не имеет такого удобного маркера, как $ , и поэтому оболочка всегда будет пытаться расширить либо...

alias@this_is_appended; alias_this_is_appended

... как единый маркер. Это также потому, что оболочка расширяет и $ var , и aliased cmdstring одновременно, что последняя не может содержаться в первой и по-прежнему выполняться без eval - но затем любые аргументы, приведенные $ var -даже $ {varcontains = '$ (cmd подстановок)'} будет оценено дважды - что может быть довольно опасным.

Поэтому я предлагаю вам сделать что-то с переменной readonly с именем $ ssh , которая выглядит так:

ssh() { case "$1" in
(@*)  set -- "$USER$@";;
esac; command -p ssh "$@"
}

readonly ssh='ssh '

Это путь вы можете сделать...

$ssh@someplace.com; $ssh@000.000.000.000

... или...

ssh @someplace.com

... и т.д. или так далее, потому что оболочка разделит два маркера $ ssh и @ somplace.com на два слова . Это не работает, однако, если вы...

"$ssh@someplace.com"

... потому что в этом случае, хотя вы получаете два маркера, результат все еще одно слово. Я использовал только для чтения выше, чтобы убедиться, что $ ssh varname не может быть саботирован и сброшен на что-то более опасное, но это все еще может быть возможно сделать с функцией ssh для любого обычного пользователя в оболочке. Я не знаю каких-либо средств, которые можно использовать для только для чтения функции оболочки, но, если это беспокоит вас, то вы можете найти функцию в сценарии оболочки $ PATH с соответствующими правами на чтение/запись.

Опять же, он может работать без функции вообще, если установлен из файла профиля или как угодно:

[mikeserv@localhost ~]$ readonly "ssh=ssh $USER"
[mikeserv@localhost ~]$ $ssh@localhost
mikeserv@localhost's password: 

Но это менее гибко.

0
27.01.2020, 20:35

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

s() {
    ssh user@"$1"
}

Затем:

s 127.0.0.1

запустится:

ssh user@127.0.0.1

Технически возможно определить отдельные псевдонимы, или сделать отдельные скрипты оболочки, которые делают то, что вы хотите, но есть 2^32 возможных адреса, так что на самом деле это не реально. Если у вас есть очень маленькое количество адресов, которые вы можете захотеть использовать, и вы знаете их заранее, вы можете сделать это просто.

3
27.01.2020, 20:35

Если вы используете bash 4 или более поздние версии, вы можете воспользоваться крюком command_not_found_handle, так как голый IP-адрес вряд ли будет действительным именем команды. Добавьте это в Ваш файл .bashrc:

command_not_found_handle () {
    if [[ $1 =~ [0-9][0-9][0-9]\.[0-9][0-9][0-9]\.[0-9][0-9][0-9]\.[0-9][0-9][0-9] ]]; then
        ssh user@$1
    else
        printf "Command not found: %s\n" "$1" >&2
        return 127
    fi
}

Если отсутствующая команда совпадает с Вашим регулярным выражением для IP адреса, она вместо этого выполнит нужную команду ssh; в противном случае, она будет имитировать поведение отсутствующей команды по умолчанию.

3
27.01.2020, 20:35

Вероятно, проще использовать конфигурационный файл ssh, чем псевдоним или функцию оболочки. Предположим, что ssh user@10.32.44.225 соединяет вас с вашей машиной разработки. Вы можете добавить в ~/.ssh/config:

Host dev
    User user
    Hostname 10.32.44.225

Теперь вы можете подключиться к машине как user с

ssh dev

Вы можете добавить больше таких псевдонимов, если у вас несколько машин; смотрите man ssh_config для получения более подробной информации.

1
27.01.2020, 20:35

В псевдонимах нет совпадений. Поэтому, если вы хотите войти в систему по адресу 192.168.0.2, не набирая перед этим ssh user@, вы должны указать:

alias 10.32.44.225="ssh user@10.32.44.225"

для каждого IP-адреса, который вы, скорее всего, будете использовать.

Конечно, вы можете написать программу, чтобы записать эти строки для нужного вам диапазона. Или сделать что-нибудь вроде:

for i in $(seq 225 228); do
    alias 10.32.44.$i="ssh user@10.32.44.$i"
done

для получения псевдонимов для диапазона 10.32.44.22510.32.44.228

2
27.01.2020, 20:35

Теги

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