호스트에 로그인하고 지시에 따라 명령을 실행하려는 bash 스크립트에 다음이 있습니다.
#!/bin/bash
echo $1;
if [ -n ${2+x} ] ; then
if [ $2 != "log" -a $2 != "cat" ] ; then
echo "$0 $1 : second argument must be empty, "tail" or "cat""
exit 1
fi
elif [ -z ${2+x} ] ; then
ssh -o StrictHostKeyChecking=no -p 2222 root@$1; echo "Reconnect?"; while read < /dev/tty; do ssh -o StrictHostKeyChecking=no -p 2222 root@$1; echo "Reconnect?"; done
elif [ $2 == "tail" ] ; then
ssh -o StrictHostKeyChecking=no -p 2222 root@$1 tail -f /var/log/dp.log; echo "Reconnect?"; while read < /dev/tty; do ssh -o StrictHostKeyChecking=no -p 2222 root@$1 tail -f /var/log/dp.log; echo "Reconnect?"; done
elif [ $2 == "cat" ] ; then
ssh -o StrictHostKeyChecking=no -p 2222 root@$1 cat /var/log/dp.log; echo "Reconnect?"; while read < /dev/tty; do ssh -o StrictHostKeyChecking=no -p 2222 root@$1 cat /var/log/dp.log; echo "Reconnect?"; done
fi
2달러를 제공하지 않으면 여전히 불평하는 것으로 나타났습니다. line 4: [: too many arguments
왜 그럴까요?
답변1
개인적으로 "Reconnect?"를 반복적으로 묻는 전체 아이디어는 성가신 일이며 기껏해야 쉘의 명령 기록을 무의미하게 복제하는 역할을 한다고 생각합니다. 진지하게, 다시 달리고 싶다면 ssh root@remotehost tail -f /var/log/dp.log
그냥 달리고 배팅하는 것이 얼마나 힘들겠습니까? Up-ArrowEnter또는 전체 명령을 입력하고 싶지 않다면 몇 가지 셸 함수나 작은 스크립트만 작성하면 됩니다(아래 예 참조).
즉, 원하는 작업을 수행하는 더 좋은 방법은 다음과 같습니다.
#!/bin/bash
error() {
local ec msg
ec="$1" ; shift
msg="$*"
[ -n "$msg" ] && echo "$msg" >&2
[ "$ec" != 0 ] && exit "$ec"
}
[ -z "$1" ] && error 1 "first argument missing. must be hostname"
echo "$1"
myssh() {
local remote reconnect quit
remote="$1" ; shift
quit=0
while [ $quit != 1 ] ; do
ssh -o StrictHostKeyChecking=no -p 2222 "$remote" "$@"
read -p "Reconnect (Y/n) [Y]? " reconnect
[[ $reconnect =~ ^[Nn] ]] && quit=1
done
}
case "$2" in
cat|log) myssh "root@$1" cat /var/log/dp.log ;;
tail) myssh "root@$1" tail -f /var/log/dp.log ;;
"") myssh "root@$1" ;;
*) error 1 "Unknown second argument '$2'" ;;
esac
이것이 더 나은 방법입니다.
chmod +x
$PATH에 ~/bin을 추가하고 다음 스크립트를 생성합니다(다음을 사용하여 실행 가능하게 만드는 것을 잊지 마십시오).
~/bin/myssh.sh:
#!/bin/sh
[ -z "$1" ] && echo hostname is required && exit 1
remote="$1" ; shift
ssh -o StrictHostKeyChecking=no -p 2222 "root@$remote" "$@"
~/bin/remote-cat.sh:
#!/bin/sh
myssh.sh "$1" cat /var/log/dp.log
~/bin/remote-tail.sh:
#!/bin/sh
myssh.sh "$1" tail -f /var/log/dp.log
필요에 따라 실행하십시오. 셸의 명령 기록을 사용하여 필요한 만큼 여러 번 실행하세요.
myssh.sh
둘 다 원격 호스트에서 루트 로그인 셸을 얻는 데 사용할 수 있습니다.그리고(다른 두 스크립트에 표시된 대로) 원격 호스트에서 루트로 임의의 명령을 실행합니다.
답변2
이 두 경우와 다음 두 경우 모두에서 $2를 마스크하면 $2가 비어 있을 때 아무것도 아닌 상태가 되는 것을 방지할 수 있습니다.
#!/bin/bash
echo $1;
if [ -n ${2+x} ] ; then
if [ "$2" != "log" -a "$2" != "cat" ] ; then
echo "$0 $1 : second argument must be empty, "tail" or "cat""
exit 1
fi
(독일어 로케일 사용):
> echo $([ != "log" -a != "cat" ])
> bash: [: Zu viele Argumente.
비교하다:
> echo $([ "" != "log" -a "" != "cat" ])
>
두 번째 문제는 먼저 확인하는 것입니다.통나무그리고 cat을 사용하지만 사용자에게 확인 중임을 알려줍니다.꼬리그리고 고양이.