별칭에 정규식을 사용하는 방법은 무엇입니까?

별칭에 정규식을 사용하는 방법은 무엇입니까?

"ssh" 명령에 대한 별칭을 만들고 싶습니다.[이메일 보호됨]"예: 10.32.44.225

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"

제가 만들어 봤지만 작동하지 않습니다. 이 명령에 구문 오류가 있습니까?

답변1

배쉬 별칭그러지 마세요- 쉘 메타문자나 와일드카드가 없는 단순한 문자열입니다. 많은 노력을 기울이면 디버그 후크가 원하는 대로 작동하도록 만들 수 있습니다(이 슈퍼유저 질문), 그러나 몇 가지 추가 문자를 입력하고 단일 인수 함수 s등을 정의하는 데 더 적합할 수 있습니다.

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

그 다음에:

s 127.0.0.1

실행 예정:

ssh [email protected]

기술적으로는 원하는 작업을 수행하기 위해 별도의 별칭을 정의하거나 별도의 셸 스크립트를 만드는 것이 가능하지만 가능한 주소는 2^32개이므로 실제로는 불가능합니다. 사용하려는 주소의 수가 적고 미리 알고 있는 경우 직접 수행할 수 있습니다.

답변2

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

별칭에 일치하는 패턴이 없습니다. 따라서 192.168.0.2아무것도 입력하지 않고 로그인 하려면 다음을 ssh user@지정해야 합니다.

alias 10.32.44.225="ssh [email protected]"

귀하가 사용할 수 있는 모든 IP 주소에 대해.

물론, 필요한 범위에 따라 이러한 줄을 작성하는 프로그램을 작성할 수 있습니다. 아니면 다음과 같이 하세요:

for i in $(seq 225 228); do
    alias 10.32.44.$i="ssh [email protected].$i"
done

범위의 별칭 가져오기 10.32.44.22510.32.44.228

답변4

이것은 가능합니다. 비록 alias제가 아는 유일한 방법은 eval인수에 포함될 수 있는 내용에 따라 위험할 수 있지만 정규식을 사용하는 것은 아닙니다. 진짜 문제는토큰화- 쉘이 읽는 모든 간단한 명령에 대해 무엇이든 시도합니다.단어그것은에서 발견된다명령 위치먼저 별칭으로. 실패하면 함수/내장으로, 둘 다 실패하면 $PATHed 실행 파일로 사용됩니다. 이는 과정을 단순화한 것이지만 진실에 매우 가깝습니다.

문제는 당신이 하나라는 것입니다단어두 가지 가능성토큰- ssh당신이 실행하고 싶은 것 @$IP입니다 .인수당신은 그것을 실행하고 싶습니다. 간단히 토큰을 두 부분으로 나누고 다른 부분에서 제안한 대로 이를 쉘 기능과 결합할 수 있습니다. 이는 쉽게 수행됩니다. 아니면 첫 번째 토큰을 얻을 수도 있습니다스스로 분열하다.

$var이름에 대한 한 가지 흥미로운 점은 쉘 이름에 포함될 수 있는 문자가 매우 명확하다는 것입니다. @그중 하나가 아닌 특별한 경우를 저장하십시오 . 만약 내가한다면:

$var_this_is_appended_to_the_name

쉘은 문자열 내의 모든 문자가 이름에 허용되기 때문에 전체 문자열을 단일 변수 이름으로 해석합니다 $var. 하지만...

$var@this_is_appended_to_the_name

...결과가 나왔다토큰 2개(반드시 2개가 아닐 경우)성격)껍질의 확장은 $var독립적입니다.@나머지. 불행히도 별칭 확장에는 편리한 표기법이 없으므로 $쉘은 항상 확장을 시도합니다...

alias@this_is_appended; alias_this_is_appended

...단일 토큰으로. 또한 쉘은 두 가지를 모두 확장하기 때문에 $var후자 aliased cmdstring는 전자 내에 포함될 수 없으며 주어진 인수 없이도 계속 실행될 수 있습니다. eval그러나 이후에 주어진 모든 인수는 $var평가 ${varcontains='$(cmd substitutions)'}될 것입니다 .두 배- 꽤 위험할 수 있어요.

따라서 다음과 같은 이름의 변수를 사용하여 readonly작업을 수행하는 것이 좋습니다.$ssh

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

readonly ssh='ssh '

그래서 당신은 할 수 있습니다 ...

[email protected]; [email protected]

...또는...

ssh @someplace.com

...등등, 쉘이 두 개의 태그를 두 개로 $ssh분할 하기 때문입니다.@somplace.com성격. 그러나 다음과 같은 경우에는 작동하지 않습니다.

"[email protected]"

...이 경우에는 두 개의 토큰을 얻더라도 결과는 여전히 단일 단어이기 때문입니다. 위에서 사용한 방법을 readonly사용하면 varname이 손상되지 않고 더 위험한 것으로 재설정되지 않지만 $ssh셸의 일반 사용자가 이 기능을 사용하면 여전히 이 작업을 수행할 수 있습니다. 쉘 함수 ssh로 이 작업을 수행할 수 있는 방법은 없지만 readonly걱정된다면 $PATH적절한 읽기/쓰기 권한이 있는 ed 쉘 스크립트에서 함수를 찾는 것이 좋습니다.

그런 다음 구성 파일이나 다른 파일에서 설정하면 기능 없이도 작동할 수 있습니다.

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

그러나 이것은 유연성이 떨어집니다.

관련 정보