1

Я хочу создать псевдоним для этой команды. ssh user @ ip as

 alias [0-9][0-9][0-9].[0-9][0-9][0-9].[0-9][0-9][0-9].[0-9][0-9][0-9] ="ssh user@$0"

Я создал его, но он не работает. Есть ли какая-либо синтаксическая ошибка в этой команде.

2 ответа2

0

Нет, вы не можете использовать этот способ.

С помощью псевдонима вы можете отсортировать команду при ее наборе. Например:

alias ls="ls -lh"

Когда вы ls , система знает, что вы говорите, что хотите выполнить ls -lh .

В вашем случае, если вы хотите, чтобы ssh user@ только имя сервера, лучше объявить что-то вроде этого:

alias myssh="ssh -l user"

Затем, когда вы выполняете myssh server вы действительно используете ssh -l user server .

0

Нет, вы не можете использовать регулярные выражения в команде псевдонимов.

Чтобы добиться того, чего вы хотите, в Bash вы можете использовать command_not_found_handle . Из справочного руководства:

Если имя не является ни функцией оболочки, ни встроенной функцией и не содержит косых черт, Bash ищет в каждом элементе $PATH каталог, содержащий исполняемый файл с этим именем. Bash использует хеш-таблицу для запоминания полных путей к исполняемым файлам, чтобы избежать многократного поиска в PATH (см. Описание хеша в Bourne Shell Builtins). Полный поиск по каталогам в $PATH выполняется только в том случае, если команда не найдена в хеш-таблице. Если поиск не выполнен, оболочка ищет определенную функцию оболочки с именем command_not_found_handle . Если эта функция существует, она вызывается с исходной командой и аргументами исходной команды в качестве аргументов, и состояние выхода функции становится состоянием выхода оболочки. Если эта функция не определена, оболочка печатает сообщение об ошибке и возвращает состояние выхода 127.

Затем вы можете сделать что-то вроде этого:

command_not_found_handle() {
    local i ip ip_ok=0
    if [[ $1 = +([[:digit:]]).+([[:digit:]]).+([[:digit:]]).+([[:digit:]]) ]]; then
        IFS=. read -a ip <<< "$1"
        ip_ok=1
        for i in "${ip[@]}"; do
            [[ $i = $((10#$i)) ]] && (( i>=0 && i<=255 )) || { ip_ok=0; break; }
        done
    fi
    if ((ip_ok)); then
        ssh "user@$1"
    else
        ( unset -f command_not_found_handle; "$@" )
    fi
}

Теперь, если вы находитесь в среде, где command_not_found_handle уже определен, например, в Ubuntu, вы знаете, классное сообщение, подобное

The program 'whatever' can be found in the following packages:
 * whatever
 * whatever-ever
Try: sudo apt-get install <selected package>

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

# Guard to not monkey-patch twice, in case this file is sourced several times
if ! declare -f kalai_command_not_found_existent &>/dev/null; then
    mapfile -s1 -t kalai_command_not_found_existent_ary < <(declare -f command_not_found_handle 2>/dev/null)
    if ((${#kalai_command_not_found_existent_ary[@]})); then
        eval "$(printf '%s\n' "kalai_command_not_found_existent ()" "${kalai_command_not_found_existent_ary[@]}")"
    else
        kalai_command_not_found_existent() { ( unset -f command_not_found_handle; "$@" ) }
    fi
    command_not_found_handle() {
        local i ip ip_ok=0
        if [[ $1 = +([[:digit:]]).+([[:digit:]]).+([[:digit:]]).+([[:digit:]]) ]]; then
            IFS=. read -a ip <<< "$1"
            ip_ok=1
            for i in "${ip[@]}"; do
                [[ $i = $((10#$i)) ]] && (( i>=0 && i<=255 )) || { ip_ok=0; break; }
            done
        fi
        if ((ip_ok)); then
            ssh "user@$1"
        else
            kalai_command_not_found_existent "$@"
        fi
    }
    unset command_not_found_existent_ary
fi

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .