Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

リアル脱出ゲーム ~デフォルトシェルがvimになってしまったら~

$
0
0

#学生LT [Part1] Advent Calendar 2017 初日は、いるやんが学生LTで喋りきれなかったネタをお送りします。


皆さんはどんなシェルをお使いでしょうか。
自分好みのシェルがある方はさぞかし chshコマンドにも造詣が深いことでしょう。
ところで、最近のエディタはどんどん進化していて、bashやzshのようなシェルなんて起動しなくとも、エディタさえあれば十分という方も多いのではないかと思います。(いいえ)
そこで、例としてvimをデフォルトシェルにした後に、元に戻す方法を紹介します。
実験環境は Xubuntu 16.04 です。

これで安心していたずらできるね!

アジェンダ

  1. # chsh -s /usr/bin/vim
  2. # chsh <ユーザ名> -s /usr/bin/vim
  3. 1, 2の合わせ技

# chsh -s /usr/bin/vim

chshでシェルを指定するためにはそのコマンドが /etc/shellsに書かれていないといけません。
ところがどっこい、スーパーユーザならなんでも指定できちゃうんです!

# chsh -s /usr/bin/vim

このコマンドを実行後、rootユーザのデフォルトシェルがvimになります。

脱出

vimには :!からシェルコマンドが実行する機能があるのですが、基本的には使えません。
なぜなら、デフォルトシェルを書き換えると、vimがコマンドを投げる先もvimになってしまうからです。

ただ、root権限でエディタが立ち上がっているので脱出は容易です。

まずは chshmanを読みましょう。
すると、ユーザアカウント情報が /etc/passwdに記されているとあるので、root権限のvim上で

:e /etc/passwd

を実行します。
/etc/passwdは以下のようなファイルになっているので、1行目をサクッと書き換えちゃいましょう。

root:!!:0:0:root:/root:/usr/bin/vim
(略)

/usr/bin/vimをフルパスのシェルのコマンド(例えば /bin/bash)に書き換えて、 :wqで保存。
再ログインすれば脱出完了、のはずです。

# chsh <ユーザ名> -s /usr/bin/vim

今度はroot以外のユーザのデフォルトシェルをvimにしてみます。
デフォルトシェルの反映は一旦ログアウトしてから、です。

脱出

例によって :!は使えません。
また、root権限のvimではないので /etc/passwdを直接編集することもできません。

なので、vimからなんとかroot権限を取る方法を考えます。
幸いにして、vimには対応している言語の処理系を呼び出す方法があります。
今回はpython3コマンドを使って、 sudoコマンドを実行します。

:python3 import os; os.system("sudo chsh <ユーザ名> -s /bin/bash")

パスワードを要求されるので、タイプします。
再ログインすれば脱出完了、のはずです。

別解

  • Shougo氏のプラグイン VimShell を使ってシェルを立ち上げる

1, 2の合わせ技

だんだん脱出が楽しくなってきましたね。
rootと一般ユーザの両方のデフォルトシェルがvimになってもやることは変わりません。

脱出

一般ユーザの時の脱出と同様にroot権限を獲得することを目指します。
ですが、 sudo chsh <ユーザ名> -s /bin/bashは失敗します。
どうやらPAMを通すタイプの認証はvimがデフォルトシェルになっているとダメらしいです。

こうしましょう。

:python3 import os; os.system("sudo su")
:e /etc/passwd

一旦rootにログインして、root権限のvimを立ち上げてから /etc/passwdを前述の方法で書き換えます。
一般ユーザのデフォルトシェルも一緒に書き換えておくと完全に脱出できると思います!

おわりに

Linuxは壊して直してが楽しいし勉強になるし、積極的に壊していこう!


Viewing all articles
Browse latest Browse all 5608

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>