知らなかったyesコマンドの真の力
yesコマンドとは?
'YES' - 妖精がみえてしまうジョンアンダーソンのプログレッシブバンドのことではありません。UNIX/Linux の yes コマンドを少しだけ語ってみたいと思います。
yesコマンドってなんですか?という人はまずUNIX/Linuxのターミナルで'yes'と入力してみましょう。
$ yes y y y^C
y がひたすら続きます。引数に文字列を渡せばその文字列をひたすら吐き出します。
$ yes "Cirque du Soleil" Cirque du Soleil Cirque du Soleil Cirque du Soleil Cirque du Soleil^C
これ意味あんの?と思いたくなります。では何に使えるのでしょう? そうターミナルで対話的に行うときに なんと あの y を入力してくれるのです。
yesの例
まずテストファイル作成
$ for i in foo hoge bar huga; do touch ${i}.txt; done $ ls *.txt bar.txt foo.txt hoge.txt huga.txt
rm -i なので対話的になります。
$ rm -i *.txt rm: 通常の空ファイル `bar.txt'を削除しますか? ^C
yes を使うと 'y'で全部消してくれる!!
$ yes | rm -i *.txt rm: 通常の空ファイル `bar.txt'を削除しますか? rm: 通常の空ファイル `foo.txt'を削除しますか? rm: 通常の空ファイル `hoge.txt'を削除しますか? rm: 通常の空ファイル `huga.txt'を削除しますか?
なんて男らしいコマンドだ。え? 「\rm -f でいいんじゃね」、「せっかくの "prompt before every removal" の意味がない」と言われそうですけど気にしないでください。私は以下みたいな使い方しています。
ユーザの一括作成コマンド
ランダムに生成したパスワードを passwdコマンドで対話的に変更するところを、 yesコマンドで自動的に入力します。
#!/bin/bash gen_password() { dd if=/dev/urandom count=2000 bs=1 2>/dev/null|\ LC_ALL=C tr -d -c '[:alnum:]' | cut -b -20 } for u in cartman stan kenny kyle do id $u > /dev/null 2>&1; stat=$? [ $stat -eq 0 ] && continue useradd -s /bin/bash -d /home/$u $u > /dev/null password=`gen_password` yes $password | passwd $u > /dev/null 2>&1 echo "$password - $u" done
こんな感じでユーザを一括で作成。
$ sudo bash gen_users.sh PoWjCBIea5IYCRVgVGIc - cartman DfLxpH9WuLfesCY9VD3V - stan U2Lsz82TuZK57vo7tcOL - kenny FjDOSQPavo2YAuENztd9 - kyle
いやー 本当にyesコマンドは便利ですよ。
最近知ったLinux/UNIXの小技
最近知って結構ショックを受けた。
touch hoge.txt と似たような機能。*1
$ > hoge.txt $ ls -l hoge.txt -rw-r--r-- 1 root root 0 Jul 10 03:15 hoge.txt
lessでtail -f ができる。
$ sudo less +F /var/log/messages
SSHでリモートサーバに対して色々
$ diff <(sort /home/user/.bashrc) <(ssh user@hostname "sort /home/user/.bashrc")
- リモートサーバのファイルを編集
$ vim scp://user@hostname//home/user/.bashrc
sambaのコマンドでWindowsを操作。
ここまで色々できるとは知らなかった。sambaのコマンドは侮れない。
- Linux/UNIXからWindowsをシャットダウン/リブート
$ net rpc shutdown -I 192.168.1.102 --user=user%password $ net rpc reboot -I 192.168.1.102 --user=user%password
$ net rpc service list -I 192.168.1.102 --user=user%password | grep -i windows AudioSrv "Windows Audio" MSIServer "Windows Installer" SharedAccess "Windows Firewall/Internet Connection Sharing (ICS)" stisvc "Windows Image Acquisition (WIA)" W32Time "Windows Time" winmgmt "Windows Management Instrumentation" Wmi "Windows Management Instrumentation Driver Extensions"
- サービスを止めたり起動したり色々。
$ net rpc service net rpc service list View configured Win32 services net rpc service start <service> Start a service net rpc service stop <service> Stop a service net rpc service pause <service> Pause a service net rpc service resume <service> Resume a paused service net rpc service status <service> View the current status of a service
man pager
- ascii一覧
$ man ascii ASCII(7) Linux Programmer’s Manual ASCII(7) 名前 ascii - ASCII 文字集合の 8 進数、10 進数、16 進数による符号化 説明 ASCII は、情報交換用米国標準コード (American Standard Code for Information Interchange) の略で、7 ビットのコードである。 (ISO 8859-1 のような) 多くの 8 ビットのコードでは下半分に ASCII を含んでいる。ASCII は国際的な規格では ISO 646 として知られている。 以下の表は 128 文字の ASCII 文字をまとめたものである。 C プログラムでの ’\X’ エスケープも注記してある。 Oct Dec Hex Char Oct Dec Hex Char ------------------------------------------------------------------------ 000 0 00 NUL ’\0’ 100 64 40 @ 001 1 01 SOH (ヘッダ開始) 101 65 41 A 002 2 02 STX (テキスト開始) 102 66 42 B
- hier - ファイルシステム階層の説明
$ man hier HIER(7) Linux Programmer’s Manual HIER(7) 名前 hier - ファイルシステム階層の説明 説明 典型的な Linux system には以下のようなディレクトリがある (他にもたくさんの ディレクトリがあるが): / ルートディレクトリ。ここが階層の起点となる。 /bin このディレクトリには、シングルユーザーモードでシステムの起動や修 理 を行う際に必要な実行形式ファイルが含まれる。 /boot ブートローダが用いる静的なファイルが含まれている。このディレクトリ にはブートプロセスの間に必要なファイルだけが置かれる。マップイン ス トーラや設定ファイルは /sbin や /etc に置くべきである。
*1:ファイルが存在したら空ファイルにされてしまうので、そのあたりは注意。