"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.225
→10.32.44.228
답변4
이것은 가능합니다. 비록 alias
제가 아는 유일한 방법은 eval
인수에 포함될 수 있는 내용에 따라 위험할 수 있지만 정규식을 사용하는 것은 아닙니다. 진짜 문제는토큰화- 쉘이 읽는 모든 간단한 명령에 대해 무엇이든 시도합니다.단어그것은에서 발견된다명령 위치먼저 별칭으로. 실패하면 함수/내장으로, 둘 다 실패하면 $PATH
ed 실행 파일로 사용됩니다. 이는 과정을 단순화한 것이지만 진실에 매우 가깝습니다.
문제는 당신이 하나라는 것입니다단어두 가지 가능성토큰- 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:
그러나 이것은 유연성이 떨어집니다.