ssh
다음과 같이 포트 전달을 사용하여 사용자 지정 명령을 실행하는 별칭이 있습니다 .
ssh -Y -L 8888:localhost:8888 hostname
물론 이것은 동일한 호스트에 대해 시작한 첫 번째 세션에서는 제대로 작동하지만 이후에는 포트 8888이 이미 사용 중이기 때문에 전달이 실패합니다.
내가 원하는 것은 ssh
동일한 서버에 대한 연결이 시작될 때마다 포트가 자동으로 조정되어 각각의 서로 다른 ssh
연결이 전달할 별도의 포트를 갖게 되는 방법을 찾는 것입니다.
예를 들어 처음으로 명령을 실행하면 다음과 같습니다.
ssh -Y -L 8888:localhost:8888 hostname
두 번째는 다음과 같습니다.
ssh -Y -L 8889:localhost:8889 hostname
등.
나는 Python이나 다른 것을 사용하여 이 작업을 수행할 수 있다는 것을 알고 있지만 내 자신의 (아마도 약간 복잡한) 스크립트를 작성하는 것보다 더 쉬운 솔루션이 있는지 궁금합니다. 그게 가능합니까?
추신: 이 작업을 수동으로 쉽게 수행할 수 있다는 것을 알고 있지만 매일 이러한 작업을 여러 번 시작하므로 더 많은 입력이 필요할 뿐만 아니라 이미 사용 중인 포트와 사용되지 않는 포트를 추적해야 합니다.
답변1
다음은 귀하가 설명하는 작업을 수행하는 짧은 스크립트입니다. 포트 번호로 명명된 파일을 잠그는 방식으로 작동하며, 실패하면 포트 번호를 증가시키고 다시 시도합니다.
포트 잠금 파일은 $HOME/.ssh/ports
생성 후에 정리되지 않지만 파일 잠금을 획득하는 중인지 확인하지는 않습니다.
스크립트는 매번 동일한 서버에 연결하는지 아니면 다른 서버에 연결하는지 상관하지 않습니다.
#!/bin/bash
PORTPATH="$HOME/.ssh/ports"
port=8888
while :; do
# We use the -E option to specify a custom exit code so that we can
# differentiate between "failed to lock file" and "ssh failed for some
# reason".
flock -n -E 121 "$PORTPATH/$port" \
ssh -Y -L "${port}:localhost:${port}" "$@" && break
exitcode=$?
if (( exitcode == 121 )); then
(( port++ ))
continue
fi
exit $exitcode
done
이 스크립트를 이라는 파일에 저장 portfw.sh
하고 다음과 같이 세 번 실행하면:
sh portfw.sh remote.example.com
출력에서 다음 프로세스를 볼 수 있습니다 ps
.
flock -n -E 121 /home/lars/.ssh/ports/8888 ssh -Y -L 8888:localhost:8888 remote.example.com
flock -n -E 121 /home/lars/.ssh/ports/8889 ssh -Y -L 8889:localhost:8889 remote.example.com
flock -n -E 121 /home/lars/.ssh/ports/8890 ssh -Y -L 8890:localhost:8890 remote.example.com