tunnel.sh
SSHトンネルをアクティブに保つために他の人が作成し、スクリプトを使用します。
#!/bin/bash
export SSH_HOST=tim@server
if [ ! -f /tmp/.tunnel ]
then
echo "Creat SSH tunnel"
ssh -f -D 9999 $SSH_HOST "if [ -f ~/.tunnel ]; then rm ~/.tunnel; fi; while [ ! -f ~/.tunnel ]; do echo > /dev/null; done" &
touch /tmp/.tunnel
else
echo "Close SSH tunnel"
ssh $SSH_HOST "touch ~/.tunnel"
rm /tmp/.tunnel
fi
exit
永続SSHトンネルを作成するには、tunnel.sh
再発行するまでトンネルは閉じませんtunnel.sh
。
SSHトンネルが実際に正常に作成されたことを確認する方法を知りたいです。
トンネルの主な用途は、サーバーと同じLAN上の一部のプリンタで文書を印刷することです。これらのプリンタはLAN内でのみアクセスできます。トンネルを作成した後に印刷すると問題はないと報告されますが、私がそこにいないため、文書が実際に印刷されたことを確認することはできません。
私は現在LANにいるので(トンネルのおかげで)私の外部IPはサーバーのIPと同じでなければならないと思いました。しかし、実際には同じではありません(私はそうすることでそれらを見つけましたwget -q -O - checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//'
)。理由を知りたいです。トンネルがアクティブな状態でインターネット上のウェブサイトにアクセスするとき、私とサーバーの間のトンネルのためにサーバーは私に接続されているインターネットウェブサイトの中間点ではありませんか?
ベストアンサー1
これは必要以上に複雑です:-)
トンネルを開始します。
ssh -f -N -D 9999 -M -S /tmp/ssh_tunnel_%h.sock -o ExitOnForwardFailure=yes $SSH_HOST && \
echo "ssh tunnel started successfully" || \
echo "ssh tunnel failed to start"
トンネルを停止します。
ssh -S /tmp/ssh_tunnel_%h.sock -O exit $SSH_HOST
。
それはあなたがしなければならないすべてです。詳細を知りたい場合は、以下をスキップしてください。
2番目の質問は知的財産権に関するものです。いいえ、あなたのIPは変更されません。あなたがしなければならないのは、リモートホストを介してSOCKSプロキシを生成することだけです。指定しない限り、システムはこのプロキシを自動的に使用しません。
SSH説明
トンネルを開始するためのパラメータ::
-f
SSHにバックエンド自体を通知します。正常に起動すると、バックグラウンドで実行されます(-o
以下のパラメータと共に)。
-o ExitOnForwardFailure=yes
:SOCKSプロキシを設定できない場合は、sshを終了するように指示します。
-N
処置: コマンドを実行しないでください。私たちはリモートホストで何もしないでトンネルだけを設定しようとしています。
-D 9999
:SOCKSプロキシ。
-M
:ここでは、-Sパラメーターが機能するために必要です。
-S /tmp/ssh_tunnel_%h.sock
: これは、/tmp/ssh_tunnel_HOSTNAME.sock を制御ソケットとして使用するように指示します。この-M
オプションは、すでにこのソケットを受信している他のSSHにコマンドを発行するのではなく、このソケットを設定する必要があることをsshに指示します。 SSHが実行されたら、このソケットを使用して追加のトンネルを設定できます。%h
ファイル名の一部としてリモートホストのホスト名を使用します。
トンネルを停止するためのパラメータ::
-S /tmp/ssh_tunnel_%h.sock
これは明らかです。ただし、-Mを実行していないため、sshはそれ自体は何もしないで、すでに存在するソケットに接続して何をすべきかを知らせる必要があります。
-O exit
:これはそれの一部です-S
。 SSH リスニングソケットに終了するよう指示します。
これにはまだ必要です$SSH_HOST
。%h
ファイル名に使用せずに絶対ソケットパスを指定しても、sshは依然としてリモートホストを指定する必要があります。それで私は%h
主張を広げました。 sshがホストを要求し、仕事を体系的に維持する場合でも、これを使用できます。