Download - SSH Tips & Tricks
SSH tips & tricks
2012/03/26 第二回ターミナル勉強会
GREE Inc.Nobutoshi Ogata
• Oracleさんにお邪魔したらコーヒーが無限に飲めました
• Oracleさんにお邪魔したら身長が10cm
伸びました
• Oracleさんにお邪魔したら彼女が出来ました
はじめましての人ははじめまして
そうでない人は(多分)
ご無沙汰してます
前回
zshと仮想端末マネージャで
快適ターミナル生活
screen, tmux, zshあたりの話をさせて頂きました
改めて自己紹介
• 尾形暢俊(おがたのぶとし)
• http://twitter.com/nobu666
• http://www.facebook.com/nobutoshi.ogata
• GREE Inc. 開発本部インフラ統括部アプリケーション基盤チーム
本日はSSHの話を中心にしていきます
「オレの*_historyが火を吹くぜ」
ということですが
多分よーぞーさんとすずきさんで十分燃えたはずなので、オレの*_historyは火を吹きません
あとネタは今回特にないので淡々といきます
SSHはただの
better telnetではない
SSHでできること
• セキュアなリモートログイン
• 通信の暗号化
• ポート転送
• セキュアなファイル転送
ここからの前提
• Linux
• OpenSSH
• SSH2プロトコル
• sshdはtcp/22でLISTEN
リモートログイン• ssh -i USER -l ~/.ssh/id_rsa REMOTE
• まぁ1-2台なら ↑この書き方でも我慢できそう
• ユーザーを使い分けたい
• 鍵を使い分けたい
.ssh/configHost hoge HostName hoge.example.com IdentityFile ~/.ssh/id_rsa.hoge User hoge_userHost moge HostName moge.example.jp IdennityFile ~/.ssh/id_rsa.moge User moge_userHost * ForwardAgent yes ServerAliveInterval 200 ForwardX11 no
エスケープがだるい• Remoteでsedやgrepするときにクォートが沢山あるとエスケープがだるい
$ ssh host “`cmd.txt`”
パスフレーズがだるい• ssh-agentとssh-add
• keychainが使えるならそっちで
$ eval `ssh-agent`$ ssh-add
• ssh-agentとssh-add
• keychainが使えるならそっちで
ssh-agent使い回し (1)
• eval `ssh-agent`するとログアウトしてもssh-agentプロセスが残ります
• セキュアにしたいならlogoutスクリプトで kill しましょう
• シェルスクリプトの関数を書いて、残ったプロセスを使いまわす
ssh-agent使い回し (2)
ssh-reagent () { for agent in /tmp/ssh-*/agent.*; do export SSH_AUTH_SOCK=$agent if ssh-add -l 2>&1 > /dev/null; then echo “Found working SSH Agent:” ssh-add -l return fi done echo “Cannot find ssh agent - maybe you should reconnect and forward it?”}
多段SSH (1)
• とあるゲートウェイを通らないとデータセンター内のマシンへ入れない
• めんどい
• でかいファイルコピーとか、ゲートウェイのディスク容量を気にしないといけない、だるい
多段SSH (2)$ ssh -o 'ProxyCommand ssh USER@GATEWAY -W %h:%p' USER@INNER_HOST
Host *-proxy User user ProxyCommand ssh gateway -W %h:%P
※ sshクライアントのOpenSSHバージョン5.4 以上※ サーバー側のバージョンは関係ないです
多段SSH (3)Host host3 ProxyCommand ssh host2 -W %h:%PHost host2 ProxyCommand ssh host1 -W %h:%PHost host1 User ore
• ↑とかやっとくと、ssh host3 というだけでhost1→host2→host3と経由してつながります
多段SSH (4)
$ ssh -t GATEWAY ssh REMOTE
• いちいち .ssh/config 書くのめんどいときにでもどうぞ
• -t しないとGATEWAYからのsshが例えばsudo -u USER ssh REMOTEだった場合ちょっと危険です
Port Forwarding (1)
• localhostのportをRemoteのportに転送
• Remoteのportをlocalhostのportに転送
• 直接は見えないところにいるLAN内のサービスを、ssh経由で無理やりトンネルすることが可能
Port Forwarding (2)
$ sudo ssh -Nf -L80:HOST:80 GATEWAY
• gateway経由でhost:80が127.0.0.1:80へ転送される
• name base virtual hostの場合は /etc/hosts
を適当に書き換える
• 踏み台経由でしかアクセスできないWebサーバをlocalのブラウザでアクセス
Port Forwarding (3)• 踏み台経由でしかアクセスできない
mysqlサーバをlocalで使う
$ ssh -Nf -L13306:HOST:3306 GATEWAY$ mysql -uroot -p -P13306 -h127.0.0.1
• 同じ要領でPOP3とかも転送可能
Port Forwarding (4)
• GATEWAY経由でしか入れないhostに、他のhostからでかいファイルを送りつける
$ ssh -fCN -L 10022:TARGET:22 USER@GATEWAY$ rsync --bwlimit=25600 --progress -az -e “ssh -p 10022” /path/to/large/file localhost:~/
Resume機能つき転送$ rsync --partial --progress --rsh=ssh SOURCE_FILE USER@HOST:DEST_FILE
$ rsync --partial --progress --rsh=ssh USER@HOST:SOURCE_FILE DEST_FILE
• Resumeが必要なファイル転送ってことは、ブツがでかいと思われるので必要に応じて --bwlimit しましょう
認証とコマンド制限from=”!foo.example.com,*.example.com”, no-pty, command=”ls” ssh-rsa AAAAB3NzaC1yc2EAAAADAQ.......
• .ssh/authorized_keys
• 192.168.0.?とか192.168.0.*とか192.168.0.0/24とか
• foo以外の*.example.comの鍵でしか認証できず、仮想端末が取れない、かつlsが実行されるだけ
Remote Diff
$ ssh USER@HOST cat /path/to/remotefile | diff /path/to/localfile -
Remote Disk Mount$ sshfs USER@HOST:/path/to/folder /path/to/mount/point
Remote Command with screen
$ ssh HOST screen -d -m /heavy/command
Login with screen$ ssh -t HOST [ $STY ] || screen -rx || screen -D -RR
公開鍵を安全にコピー$ ssh-copy-id
大量のサーバにssh
$ pssh -h hostlist.txt -i “grep -ri err /var/log”
※ http://freecode.com/projects/pssh
zsh+tmuxでsshしたら新ウィンドウ
# ~/.zshrcif [ $TERM = screen ]; then function ssh_tmux() { eval server=\${$#} tmux new-window -n $@ "exec ssh $@" } alias ssh=ssh_tmuxfi
sshコネクション多重化# ~/.ssh/configControlMaster autoControlPath ~/.ssh/connections/%r@%h:%p
• 普通はサーバー側にsshdが沢山あがります
• ↑これをやると1つのsshdが複数のsshの面倒をみるようになります
• コネクション確立済みなら認証不要
サーバー毎にエンコーディングが違う$ sudo (brew|port) install cocot$ cocot -t UTF-8 -p EUC-JP ssh HOST
• cygwin版もあるっぽい• -t でターミナルの文字コード• -p で接続先の文字コード
※ https://github.com/vmi/cocot
社内から外へはPROXY
経由しか開いてない!• stoneを使う
OUTER$ sudo stone localhost:22 443INNER$ stone proxy.example.com:8080/http 10022 ‘CONNECT OUTER:443 HTTP/1.0’
OUTER$ ssh -p 10022 localhost
※ http://www.gcd.org/sengoku/stone/Welcome.ja.html
なんか認証できないとき
• パーミッションを疑う• ~/• ~/.ssh• ~/.ssh/authorized_keys• ~/.ssh/id_rsa• ssh -vvv• sshd -d
SSHがあればなんでもできる!!
まだまだ紹介しきれないほど機能が豊富
物足りないあなたはLet’s “man ssh_config”
ご清聴ありがとうございました