タグ別アーカイブ: Linux

SSH接続ユーザの強制ログアウト方法

ずっとログインしたままのユーザが居ると聞いてwコマンドで確認。
fオプションは接続元IPを非表示にします。これは最初から接続元が分かっているのであれば不要なのと実行中のコマンド内容が右端で切れてしまうのでそれを防ぐためにつけています。
実験的にVMのCentOS6.4で試してみました。

[root@CentOS64 ~]# w -f
08:40:57 up 15 min, 3 users, load average: 0.00, 0.03, 0.08
USER TTY LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 08:40 0.00s 0.05s 0.03s w -f
user1 pts/1 26Nov13 21days 0.01s 0.01s -bash
user2 pts/2 26Nov13 21days 0.01s 0.01s -bash

2人のユーザがログインしたまま放置されていました。全くけしからん。
次にpsコマンドの結果からsshdを抽出し対象のプロセスIDを調べます。

[root@CentOS64 ~]# ps ax | grep sshd
1093 ? Ss 0:00 /usr/sbin/sshd
1252 ? Ss 0:00 sshd: user1 [priv]
1256 ? S 0:00 sshd: user1@pts/1
1272 ? Ss 0:00 sshd: user2 [priv]
1276 ? S 0:00 sshd: user2@pts/2
1349 ? Ss 0:00 sshd: root@pts/0
1368 pts/0 S+ 0:00 grep sshd

ここで見るのはptsとついた行になります。
もっと絞り込めば、こんな感じでしょうか。

[root@CentOS64 ~]# ps ax | grep "sshd: .*@pts/"
1256 ? S 0:00 sshd: user1@pts/1
1276 ? S 0:00 sshd: user2@pts/2
1349 ? Ss 0:00 sshd: root@pts/0
1393 pts/0 S+ 0:00 grep sshd: .*@pts/

こうすれば対象のプロセスIDが1256と1276であることが分かります。

それでは殺しましょうw

[root@CentOS64 ~]# kill 1256
[root@CentOS64 ~]# kill 1276

これでログインしたままのユーザを強制排除できました。さっそく確認しましょう。

[root@CentOS64 ~]# ps ax | grep "sshd: .*@pts/"
1349 ? Ss 0:00 sshd: root@pts/0
1395 pts/0 S+ 0:00 grep sshd: .*@pts/

ね、生きていないですねw

用法は
・メンテしたいのでユーザに出て行って欲しい時
・不審な接続の排除
・通信切れ等で残ったゴミ接続の掃除
となります。

因みにユーザ権限では他のユーザを追い出すことは出来ませんのでご心配なく。

expectでssh自動接続

実はMacのネタですがLinux枠でw

普段使うノートがMacになったので急に障害連絡が来た時にメンテ可能な端末はMacしかない。でもBSDベースなので親和性が高く楽にできると何もせず構えてたら結構面倒だったw
これまではTeratermのマクロを準備していて例えば10台のサーバに一気にログインする必要があったりするときマクロファイルをダブルクリックでガンガンログインしていたのだが、MacにはTeratermないし同様の機能をどうするかなっと検索。
#!/usr/bin/expect
set timeout 1
spawn ssh root@192.168.56.101
expect “password: “
send “111111n”
expect “[.*]$ “
send “ls -ln”
expect “[.*]$ “
interact
結論としてexpectを利用してsshと対話してしまえば良い事が分かった。これならLinux上でもそのまま使える。但し二段階ログインした上でその先での操作が出来るかどうかについては確認していないが無理そうな気がする。
これはシェルスクリプトな感覚で作成します。違いは一行目にshではなくexpectを定義している点とその後のコマンド送信がteratermマクロっぽい感じになっていること(多分expectの方が先だと思いますがw)
spawnの行でsshコマンドを書き秘密鍵を利用するならここにオプションも一緒に書けば良いと思う(秘密鍵を使う場合はパスワード暗記しているケースが多いのでexpectの世話にはなり難いと思うが)
expectは待ち受ける文字列、ここではpassword: とプロンプトを待っている記述がある。
そしてsendがターミナルに送信するコマンドです。
最後のinteractはログインしたままの状態で終了するおまじない。これが無いとSSH接続を終了するので用途によって付けたり付けなかったりします。