harry’s memorandum

おれおれメモ

知らなかった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でリモートサーバに対して色々
  • リモート先のファイルをsortして比較。パスフレーズなしにするか、ssh-agentを使用するかしてください。
$ 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 ’\0100   64    40    @
       001   1     01    SOH (ヘッダ開始)            101   65    41    A
       002   2     02    STX (テキスト開始)          102   66    42    B
$ man hier
HIER(7)                    Linux Programmer’s Manual                   HIER(7)

名前
       hier - ファイルシステム階層の説明

説明
       典型的な Linux system には以下のようなディレクトリがある (他にもたくさんの
       ディレクトリがあるが):

       /      ルートディレクトリ。ここが階層の起点となる。

       /bin   このディレクトリには、シングルユーザーモードでシステムの起動や修 理
              を行う際に必要な実行形式ファイルが含まれる。

       /boot   ブートローダが用いる静的なファイルが含まれている。このディレクトリ
              にはブートプロセスの間に必要なファイルだけが置かれる。マップイン ス
              トーラや設定ファイルは /sbin や /etc に置くべきである。

*1:ファイルが存在したら空ファイルにされてしまうので、そのあたりは注意。