問題
- インターネットアクセスにHTTP(S)プロキシが必要な環境(社内)と、外の環境(ノマド)を行ったり来たりする。
-
curl
、git
、scp
、ssh
、rsync
、wget
あたりのコマンドのプロキシ設定の切り替えが非常に面倒くさい。どうにか簡単に切り替えたい。諦めるな、戦え。
解決策
シェルスクリプトでラップしてプロキシ設定を変えてやる。
proxied
#!/bin/bash
set -eu
PROXY=http://proxy.xxx.yyy.zzz:8080
PROXY_HOST=proxy.xxx.yyy.zzz
PROXY_PORT=8080
SSH_CONFIG_FILE=~/.ssh/config_proxied
ssh() {
command ssh -F $SSH_CONFIG_FILE "$@"
}
scp() {
command scp -F $SSH_CONFIG_FILE "$@"
}
export GIT_SSH_COMMAND="ssh -F $SSH_CONFIG_FILE"
export RSYNC_RSH="ssh -F $SSH_CONFIG_FILE"
export http_proxy=$PROXY
export https_proxy=$PROXY
export no_proxy=localhost
export JAVA_OPTS="${JAVA_OPTS:-} -DproxyHost=$PROXY_HOST -DproxyPort=$PROXY_PORT"
"$@"
~/.ssh/config_proxied
Host github.com
HostName ssh.github.com
Port 443
ProxyCommand connect -H proxy.xxx.yyy.zzz:8080 %h %p
Host gist.github.com
HostName ssh.github.com
Port 443
ProxyCommand connect -H proxy.xxx.yyy.zzz:8080 %h %p
Host bitbucket.org
HostName altssh.bitbucket.org
Port 443
ProxyCommand connect -H proxy.xxx.yyy.zzz:8080 %h %p
Host gitlab.com
HostName altssh.gitlab.com
Port 443
ProxyCommand connect -H proxy.xxx.yyy.zzz:8080 %h %p
# そのほかプロキシを介した踏み台サーバー経由的な多段SSHな設定群....
ここで使っているconnectは1、Ubuntuならapt install connect-proxy
、Homebrewならbrew install connect
でインストールできる。CentOS 7だとyum install connect-proxy
でインストールできるが、バイナリ名がconnect
ではなく本当にconnect-proxy
であるのでProxyCommand
を変える必要があることに注意。
これでproxied ssh ...
のように頭にproxied
を付けると、プロキシ経由で外部へ出るコマンドとなる。
コマンド補完
そのままではBash-Completionが働かない。なので次のコマンドを.bashrc
に追加しておくとよい。
.bashrc
complete -F _command proxied