PCI製Wi-Fiマルチポケットルータ MZK-MF300D [小技(Linux)]
会社でスマホを使ってAdobeのShadowとかいうソフトと連携してデザインの開発作業をしたいんだけど…と言われ、事務所内の社内ネットワークにWi-Fiで接続するのはちょっとどーなのよ…と文句を言いたい気持ちをぐっとこらえ、やむなくプラネックス(PCI)製の激安な「Wi-Fiマルチポケットルータ」 MZK-MF300D なるものを買ってきた。
どうやら、スマホのWi-FiアドレスとAdobe Shadowとかいうソフトの入っているPCとが同じネットワークにある必要があるらしく、「そうしてくれ」との強い要望を受けたので、MZK-MF300Dをマニュアルガン無視でアクセスポイントモードに切り替えてセットアップ。ネットワークの設定、マルチAPの無効化、無線の設定、管理者パスワードの変更などなどを経てセットワークに接続。スマホでアクセスが出来ることを確認して引き渡した。
ところが!
「あの~。開発環境にアクセスできないんですけど~。」
という知らせが。どうも、DNSで名前解決が出来ないらしい。
アクセスポイントの設定を見直すが、よくよく見て見ると、そもそもDNSサーバのアドレスを入れる項目がどこにもない。でも、なにやらDNSは引けてる。
はあ?
どうやらMZK-MF300Dはどこか我々の知らないところに立っているDNSを参照しているもよう。社内ネットワークとかの内部DNSを見せる事はこのままでは出来ないようだ。
しかし、開発環境とかテスト環境とかいうものは外部に曝す訳にはいかないじゃないか。
そこで…iptablesでアクセス経路をひん曲げてやればよくね?
と、思い立ち以下のような作戦を立案した。
①MZK-MF300Dの全てのトラフィックを、どこか他のサーバで一旦全部受け取る
↓
②iptablesでマスカレード、本来のデフォルトゲートウェイに中継してやる
↓
③でも53/tcp、53/udpだけはDNSサーバに向かってパケットの飛び先を曲げてしまう
こうすれば、MZK-MF300Dの馬鹿DNSは騙されてくれることだろう!!
と、妄想したのだ。
ちと手頃なサーバが他に居なかったので、「セキュリティ的にちょっとどうよ!?」という懸念はあるものの、一先ず社内のDNSサーバにMZK-MF300Dのトラフィックを総受けしてもらう役割も担当してもらうこととした。
後日、忘れてなければ直す!(たぶん)
というわけで、そのDNSサーバな子で以下実行。
手順1:/etc/sysctl.confに「net.ipv4.ip_forward = 1」を書く。
手順2:sysctl -p 実行
手順3:service iptables start 実行
手順4:Wi-Fiから来たトラフィックを全部本来のデフォルトゲートウェイに飛ばすため以下実行
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
手順5:MZK-MF300Dの内蔵馬鹿DNSからの問い合わせを、社内DNSサーバで解決するため、パケットをぶんどる設定を入れるため以下実行
iptables -t nat -A PREROUTING -s (MZK-MF300Dのアドレス) -p tcp --dport 53 -j DNAT --to (社内DNSサーバのアドレス):53
iptables -t nat -A PREROUTING -s (MZK-MF300Dのアドレス) -p udp --dport 53 -j DNAT --to (社内DNSサーバのアドレス):53
で、念のためMZK-MF300Dを再起動。
Wi-Fiアクセスから適当な社内サーバの名前をnslookup するとちゃんと解決できた。(殺気はダメだった)
というわけで一先ず問題解決っぽい。デザイナーの人も大丈夫ですと言っているので大丈夫なのだろう。
教訓:安物買いのなんとやら。会社で使うものはもっとちゃんとした物を買いましょう。(笑)
どうやら、スマホのWi-FiアドレスとAdobe Shadowとかいうソフトの入っているPCとが同じネットワークにある必要があるらしく、「そうしてくれ」との強い要望を受けたので、MZK-MF300Dをマニュアルガン無視でアクセスポイントモードに切り替えてセットアップ。ネットワークの設定、マルチAPの無効化、無線の設定、管理者パスワードの変更などなどを経てセットワークに接続。スマホでアクセスが出来ることを確認して引き渡した。
ところが!
「あの~。開発環境にアクセスできないんですけど~。」
という知らせが。どうも、DNSで名前解決が出来ないらしい。
アクセスポイントの設定を見直すが、よくよく見て見ると、そもそもDNSサーバのアドレスを入れる項目がどこにもない。でも、なにやらDNSは引けてる。
はあ?
どうやらMZK-MF300Dはどこか我々の知らないところに立っているDNSを参照しているもよう。社内ネットワークとかの内部DNSを見せる事はこのままでは出来ないようだ。
しかし、開発環境とかテスト環境とかいうものは外部に曝す訳にはいかないじゃないか。
そこで…iptablesでアクセス経路をひん曲げてやればよくね?
と、思い立ち以下のような作戦を立案した。
①MZK-MF300Dの全てのトラフィックを、どこか他のサーバで一旦全部受け取る
↓
②iptablesでマスカレード、本来のデフォルトゲートウェイに中継してやる
↓
③でも53/tcp、53/udpだけはDNSサーバに向かってパケットの飛び先を曲げてしまう
こうすれば、MZK-MF300Dの馬鹿DNSは騙されてくれることだろう!!
と、妄想したのだ。
ちと手頃なサーバが他に居なかったので、「セキュリティ的にちょっとどうよ!?」という懸念はあるものの、一先ず社内のDNSサーバにMZK-MF300Dのトラフィックを総受けしてもらう役割も担当してもらうこととした。
後日、忘れてなければ直す!(たぶん)
というわけで、そのDNSサーバな子で以下実行。
手順1:/etc/sysctl.confに「net.ipv4.ip_forward = 1」を書く。
手順2:sysctl -p 実行
手順3:service iptables start 実行
手順4:Wi-Fiから来たトラフィックを全部本来のデフォルトゲートウェイに飛ばすため以下実行
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
手順5:MZK-MF300Dの内蔵馬鹿DNSからの問い合わせを、社内DNSサーバで解決するため、パケットをぶんどる設定を入れるため以下実行
iptables -t nat -A PREROUTING -s (MZK-MF300Dのアドレス) -p tcp --dport 53 -j DNAT --to (社内DNSサーバのアドレス):53
iptables -t nat -A PREROUTING -s (MZK-MF300Dのアドレス) -p udp --dport 53 -j DNAT --to (社内DNSサーバのアドレス):53
で、念のためMZK-MF300Dを再起動。
Wi-Fiアクセスから適当な社内サーバの名前をnslookup するとちゃんと解決できた。(殺気はダメだった)
というわけで一先ず問題解決っぽい。デザイナーの人も大丈夫ですと言っているので大丈夫なのだろう。
教訓:安物買いのなんとやら。会社で使うものはもっとちゃんとした物を買いましょう。(笑)
改行コードを捨てる [小技(Linux)]
会社で、「あるテキストファイル(複数行記述されている)の改行コードを全部カットしたいんですけどー、なんかいい方法ないっすかね?」と聞かれた。彼はsedコマンドでいろいろ頑張っていたが、そういう用途には基本的にsedは不向きであることを教えて(出来ないわけじゃない)他の方法を探らせてみた。
…というか、彼はその方法を今まさに考え中だ。(笑)
コマンドを知っていても、その活用方法を知らなければ効果は半減する。英単語それ自体を知っていても、熟語とか慣用句、言い回しを知らなければ意味がないのと一緒だ。コマンドの「ボキャブラリー」をどれだけ増やせるかが問題なんだ!!
というわけで、彼が(なぜか)苦しんでいる間に、ここに正解をいくつか書いてしまおう(笑)。
なお、ここで使用するファイルは…
というファイルであるとする。
方法その1:trコマンド
てか、真っ先にコレが思いつくべきじゃないかと個人的には思うんだけども。(笑)
ファイルの一番最後の改行まで削除されてしまいコマンドプロンプトまでうしろにくっついているけどな!(大笑)
方法その2:awkコマンド
sedを思いつくならawkも忘れないで!!(笑)
trコマンドと全く一緒だ。
まあ、awkがアリだというのなら、perlでもphpでもrubyでもC/C++でもJavaでもアリじゃん…というツッコミはここでは禁止である。(笑)
方法その3:echoコマンドとcatコマンド…というか重要なのはむしろ「`」(バック・クォート)
これはtrコマンドとかとちょっと見栄えが変わるけども、「1行にする」という命題は一応クリアするぞ!?
改行がスペースに変換されて並んでますな。
さて。彼は一体どんな方法を思いつくだろうか!!!!
若人よがんばれ!!(笑)
…というか、彼はその方法を今まさに考え中だ。(笑)
コマンドを知っていても、その活用方法を知らなければ効果は半減する。英単語それ自体を知っていても、熟語とか慣用句、言い回しを知らなければ意味がないのと一緒だ。コマンドの「ボキャブラリー」をどれだけ増やせるかが問題なんだ!!
というわけで、彼が(なぜか)苦しんでいる間に、ここに正解をいくつか書いてしまおう(笑)。
なお、ここで使用するファイルは…
[root@sawako tmp]# cat /tmp/test.txt Yui Mio Ritsu Tsumugi Azusa
というファイルであるとする。
方法その1:trコマンド
てか、真っ先にコレが思いつくべきじゃないかと個人的には思うんだけども。(笑)
[root@sawako tmp]# tr -d "\n" < /tmp/test.txt YuiMioRitsuTsumugiAzusa[root@sawako tmp]#
ファイルの一番最後の改行まで削除されてしまいコマンドプロンプトまでうしろにくっついているけどな!(大笑)
方法その2:awkコマンド
sedを思いつくならawkも忘れないで!!(笑)
[root@sawako tmp]# awk '{printf "%s",$0}' /tmp/test.txt YuiMioRitsuTsumugiAzusa[root@sawako tmp]#
trコマンドと全く一緒だ。
まあ、awkがアリだというのなら、perlでもphpでもrubyでもC/C++でもJavaでもアリじゃん…というツッコミはここでは禁止である。(笑)
方法その3:echoコマンドとcatコマンド…というか重要なのはむしろ「`」(バック・クォート)
これはtrコマンドとかとちょっと見栄えが変わるけども、「1行にする」という命題は一応クリアするぞ!?
[root@sawako tmp]# echo `cat /tmp/test.txt` Yui Mio Ritsu Tsumugi Azusa [root@sawako tmp]#
改行がスペースに変換されて並んでますな。
さて。彼は一体どんな方法を思いつくだろうか!!!!
若人よがんばれ!!(笑)
ファイルを置きすぎたディレクトリでファイルの一覧が見たい時 [小技(Linux)]
1つのディレクトリの中に、ファイルを超大量に置いてはいけないということは、サーバ管理の鉄則でもありますが(特にext3とかな!)、たまーにやっちゃう人がいますね。(笑)1つのディレクトリに数千ファイルとか1万ファイルとか!!!!!!
で、そんなディレクトリでlsなんてやっちまった日にゃ…
もう、いやな予感しかしないディレクトリがありますね?^-^
では、ls -la してみましょう!!!
へんじがない。ただのしかばねのようだ・・・
てな具合になっちまう訳ですよもう。
でも、場合によっては、ど~~~~~~しても、ファイルのリストが見たいの!みたいな場合も有りますよね?
そんなあなたには、findコマンドがお役に立ちます。^-^
ひとまず、ファイル名とかはこれで確認できます。
で、そんなディレクトリでlsなんてやっちまった日にゃ…
[root@konata cache_page]# ls -la 合計 21448 drwxrwxrwx 127 dev dev 4096 4月 4 21:11 . drwxrwxrwx 3 dev dev 4096 6月 30 2009 .. (途中省略) drwxrwxrwx 2 dev dev 6254592 4月 4 21:16 pickup (さらに省略) drwxrwxrwx 362 nobody nobody 1286144 4月 4 21:17 announce drwxrwxrwx 2 dev dev 6197248 4月 4 21:17 index drwxrwxrwx 2 dev dev 86016 1月 8 16:19 index2 drwxrwxrwx 2 dev dev 2994176 3月 1 2010 index3 (以下略)
もう、いやな予感しかしないディレクトリがありますね?^-^
では、ls -la してみましょう!!!
[root@konata cache_page]# cd pickup [root@konata pickup]# ls -la
へんじがない。ただのしかばねのようだ・・・
てな具合になっちまう訳ですよもう。
でも、場合によっては、ど~~~~~~しても、ファイルのリストが見たいの!みたいな場合も有りますよね?
そんなあなたには、findコマンドがお役に立ちます。^-^
[root@konata pickup]# find . -print . ./cache_baea74f5ce6b3ee89c4d2493b93240ee_cc61cc31dd333eac4b580d ./cache_baea74f5ce6b3ee89c4d2493b93240ee_d367f0559782ffdebddfe3 ./cache_baea74f5ce6b3ee89c4d2493b93240ee_b246d51c1e42cbad61e348 ./cache_baea74f5ce6b3ee89c4d2493b93240ee_14fcf1db4202c611dd0260 ./cache_baea74f5ce6b3ee89c4d2493b93240ee_dd11224a64b71d5622c3c3 ./cache_baea74f5ce6b3ee89c4d2493b93240ee_f558391470dfa0f7cf9407 ./cache_baea74f5ce6b3ee89c4d2493b93240ee_57f72ef84cda3d2b99c158 ./cache_baea74f5ce6b3ee89c4d2493b93240ee_b5a396b0c7ff57aa323200 ./cache_baea74f5ce6b3ee89c4d2493b93240ee_c8687e129ad9c840419b77 (ファイルの一覧がだーーーーーーーっと表示)
ひとまず、ファイル名とかはこれで確認できます。
計画停電とLinux [小技(Linux)]
まずは、遅ればせながら東北関東大震災で被災された皆様には心よりお見舞い申し上げます。
さて、現在東京電力エリア内では「計画停電」真っ盛りですが、計画停電の時間が始まるまでにはなんとかしてサーバを自動でシャットダウンしたいものです。
そこで、その方法を紹介します。
atコマンドを使います。
と、その前に、まずは「atd」が起動していることを確認しましょう。
3行目の「/usr/sbin/atd」がソレです。起動していない場合は、 service atd start なりしておきましょう。自動起動の設定なら chkconfig atd on です。
そして、計画停電が6:20から開始される場合なら、5分前にシャットダウンしておくとすると
at 6:15
とか実行します。すると…
とかプロンプトが表示されますので、ここにシャットダウンコマンドを記述します。
↑まずはこんな感じ。そして、Enterキーを忘れずに押しておきましょう。2行目のプロンプトが表示されます。
↑こうなる。そしたら、「Ctrl + D」でプロンプトを抜けます。
というように、「ジョブID」とそのジョブが実行される正確な日時が表示されます。
ちなみに、atコマンドに指定した時刻が…
① まだ到来していない場合
(例)atコマンドを入力した時間が12:00で、atコマンドの引数に指定した時間が18:00だった場合
→その日の18:00に実行されます
② もう過ぎちゃった場合
(例) (例)atコマンドを入力した時間が12:00で、atコマンドの引数に指定した時間が06:00だった場合
→次の日の06:00に実行されます
ちゃんとatコマンドによるジョブが登録されたかどうか確認したい場合は、「atq」コマンドで確認できます。
atqコマンドで表示されているのは、ジョブIDが「3」で、そのジョブは2011-03-24の06:20に実行されることがわかります。
ジョブの詳細が知りたい場合は、「at -c」で見ることが出来ます。-cオプションに続けてジョブIDを指定します。
環境変数の設定が自動的に行われるので、最初びっくりするかもしれませんが、最後のほうに「shutdown -h now」がちゃんと追加されていることがわかります。
「間違えて登録しちゃった!」という場合、ジョブを削除するのは「atrm」コマンド。ジョブIDを続けて指定するとそのジョブが削除されます。
↑こんな具合。
あとは時間が来ればサーバがシャットダウンされます。
ところで、東京電力が公表している計画停電の予定に併せて、今日・明日の分だけでなくもっと先の予定まで登録しておきたい!という場合にも対応できます。
いちいちatコマンドでshutodownと書くのは面倒くさいので、まず最初に実行したいコマンドを記述したファイルを作成しておきます。例えばこんな具合。
echo "shutdown -h now" > /tmp/command.txt
atコマンドに「-f」オプションを追加ます。
先ほど紹介したときに時刻だけを記述した項目には日付も同時に指定することができます。
例えば、2011年3月31日の6:15にサーバをシャットダウンしたいなら、
at -f /tmp/command.txt 06:15 03/31/2011
と、時間と日付を指定すればOK。
なお、日付のところに「tomorrow」と書けば、「明日の」6:15に実行されるし、「今から1時間後」という指定も可能で、
at -f /tmp/command.txt now + 1 hour
と指定すればよい。他にも便利で楽しい日時の指定方法があるが、紹介してると終わらなくなるので(笑)基本的なものだけ紹介した。
さて、現在東京電力エリア内では「計画停電」真っ盛りですが、計画停電の時間が始まるまでにはなんとかしてサーバを自動でシャットダウンしたいものです。
そこで、その方法を紹介します。
atコマンドを使います。
と、その前に、まずは「atd」が起動していることを確認しましょう。
[root@haruka ~]# ps -ef | fgrep atd root 1157 16571 0 11:14 pts/5 00:00:00 fgrep atd rpcuser 2667 1 0 Jan08 ? 00:00:00 rpc.statd root 2870 1 0 Jan08 ? 00:00:00 /usr/sbin/atd
3行目の「/usr/sbin/atd」がソレです。起動していない場合は、 service atd start なりしておきましょう。自動起動の設定なら chkconfig atd on です。
そして、計画停電が6:20から開始される場合なら、5分前にシャットダウンしておくとすると
at 6:15
とか実行します。すると…
[root@haruka ~]# at 6:15 at>
とかプロンプトが表示されますので、ここにシャットダウンコマンドを記述します。
[root@haruka ~]# at 6:15 at> shutdown -h now
↑まずはこんな感じ。そして、Enterキーを忘れずに押しておきましょう。2行目のプロンプトが表示されます。
[root@haruka ~]# at 6:15 at> shutdown -h now at>
↑こうなる。そしたら、「Ctrl + D」でプロンプトを抜けます。
[root@haruka ~]# at 6:15 at> shutdown -h now at> job 1 at 2011-03-24 06:15
というように、「ジョブID」とそのジョブが実行される正確な日時が表示されます。
ちなみに、atコマンドに指定した時刻が…
① まだ到来していない場合
(例)atコマンドを入力した時間が12:00で、atコマンドの引数に指定した時間が18:00だった場合
→その日の18:00に実行されます
② もう過ぎちゃった場合
(例) (例)atコマンドを入力した時間が12:00で、atコマンドの引数に指定した時間が06:00だった場合
→次の日の06:00に実行されます
ちゃんとatコマンドによるジョブが登録されたかどうか確認したい場合は、「atq」コマンドで確認できます。
[root@haruka ~]# atq 3 2011-03-24 06:15 a root [root@haruka ~]# date 2011年 3月 23日 水曜日 11:25:23 JST
atqコマンドで表示されているのは、ジョブIDが「3」で、そのジョブは2011-03-24の06:20に実行されることがわかります。
ジョブの詳細が知りたい場合は、「at -c」で見ることが出来ます。-cオプションに続けてジョブIDを指定します。
[root@haruka ~]# at -c 3 #!/bin/sh # atrun uid=0 gid=0 # mail root 0 umask 22 HOSTNAME=haruka.mycompany.com; export HOSTNAME SHELL=/bin/bash; export SHELL (途中省略) shutdown -h now [root@haruka ~]#
環境変数の設定が自動的に行われるので、最初びっくりするかもしれませんが、最後のほうに「shutdown -h now」がちゃんと追加されていることがわかります。
「間違えて登録しちゃった!」という場合、ジョブを削除するのは「atrm」コマンド。ジョブIDを続けて指定するとそのジョブが削除されます。
[root@haruka ~]# atrm 3 [root@haruka ~]# atq
↑こんな具合。
あとは時間が来ればサーバがシャットダウンされます。
ところで、東京電力が公表している計画停電の予定に併せて、今日・明日の分だけでなくもっと先の予定まで登録しておきたい!という場合にも対応できます。
いちいちatコマンドでshutodownと書くのは面倒くさいので、まず最初に実行したいコマンドを記述したファイルを作成しておきます。例えばこんな具合。
echo "shutdown -h now" > /tmp/command.txt
atコマンドに「-f」オプションを追加ます。
先ほど紹介したときに時刻だけを記述した項目には日付も同時に指定することができます。
例えば、2011年3月31日の6:15にサーバをシャットダウンしたいなら、
at -f /tmp/command.txt 06:15 03/31/2011
と、時間と日付を指定すればOK。
なお、日付のところに「tomorrow」と書けば、「明日の」6:15に実行されるし、「今から1時間後」という指定も可能で、
at -f /tmp/command.txt now + 1 hour
と指定すればよい。他にも便利で楽しい日時の指定方法があるが、紹介してると終わらなくなるので(笑)基本的なものだけ紹介した。
複数のテープにまたがるデータを途中のテープから戻す方法 [小技(Linux)]
例えばLTOとか、DDSとか、QMT(CMT)とか、DLTとかいったようなテープデバイスにデータを退避してあるとする。データ量が多くて1本のテープに収まりきらない場合にはcpioコマンドなら複数のテープにまたがって一つのボリュームなりバックアップデータなりをまとめて退避することができる。
が、この場合に特有の困った問題が発生することがある。テープの読み取りエラーである。
8ビットパソコン世代のオッサンなら、Tape read errorとでも言えばイメージが涌きやすいだろうか。(大笑)
例えば、cpioコマンドでデータをテープにバックアップしたとする。退避するときに
cd /some/directory
find . -print | cpio -oBv -H newc >/dev/st0
とかいう具合にデータをバックアップしたとする。(オプション類はお好みに応じてどうぞ)
で、復元する場合、普通は…
cd /some/restore
cpio -iBvumd < /dev/st0
とかいう感じで戻すことになると思う。(オプション類はお好みに応じてどうぞ)
このとき、テープの1本目の先頭部分には「-H」オプションを指定した場合のフォーマット情報が保存されるそうで、復元する場合には「-H」オプションは省略しても構わないことになっている。(別に記述してもよいけど)
さて。ここで不幸にして1本目のテープでエラーが出ちゃったとする。しかしお目当てのデータはまだ復元されていない!!2本目のテープに望みをかけたいが先に進まず止まっちゃった! みたいな場合。
あるいは、なぜか1本目のテープが見当たらない!!テープの保管場所にあるはずなのにど~しても見当たらない!! みたいな場合。
もしくは、1本目のテープにうっかり全然違うデータを上書きして壊しちゃった!!!どーしよう!!! みたいな場合。
2本目以降から(3本目でも4本目でもいいけど)復元したい場合は、普通にcpioコマンドを実行するが、「-H」オプションを必須で指定する必要がある。
cd /some/restore
cpio -iBvumd -H newc< /dev/st0
すると、テープをまたがって記録されているファイルの次のファイルから復元することができる。
実行するとおそらくこんな具合にワーニングメッセージが出るが。
cpio: warning: skipped ??????? bytes of junk
「???????」のところには何らかの数値が入る。要するに読み飛ばされるデータのバイト数である。
ひとまずこれで、2本目以降のデータをなんとか復元することも可能ではある。
が、この場合に特有の困った問題が発生することがある。テープの読み取りエラーである。
8ビットパソコン世代のオッサンなら、Tape read errorとでも言えばイメージが涌きやすいだろうか。(大笑)
例えば、cpioコマンドでデータをテープにバックアップしたとする。退避するときに
cd /some/directory
find . -print | cpio -oBv -H newc >/dev/st0
とかいう具合にデータをバックアップしたとする。(オプション類はお好みに応じてどうぞ)
で、復元する場合、普通は…
cd /some/restore
cpio -iBvumd < /dev/st0
とかいう感じで戻すことになると思う。(オプション類はお好みに応じてどうぞ)
このとき、テープの1本目の先頭部分には「-H」オプションを指定した場合のフォーマット情報が保存されるそうで、復元する場合には「-H」オプションは省略しても構わないことになっている。(別に記述してもよいけど)
さて。ここで不幸にして1本目のテープでエラーが出ちゃったとする。しかしお目当てのデータはまだ復元されていない!!2本目のテープに望みをかけたいが先に進まず止まっちゃった! みたいな場合。
あるいは、なぜか1本目のテープが見当たらない!!テープの保管場所にあるはずなのにど~しても見当たらない!! みたいな場合。
もしくは、1本目のテープにうっかり全然違うデータを上書きして壊しちゃった!!!どーしよう!!! みたいな場合。
2本目以降から(3本目でも4本目でもいいけど)復元したい場合は、普通にcpioコマンドを実行するが、「-H」オプションを必須で指定する必要がある。
cd /some/restore
cpio -iBvumd -H newc< /dev/st0
すると、テープをまたがって記録されているファイルの次のファイルから復元することができる。
実行するとおそらくこんな具合にワーニングメッセージが出るが。
cpio: warning: skipped ??????? bytes of junk
「???????」のところには何らかの数値が入る。要するに読み飛ばされるデータのバイト数である。
ひとまずこれで、2本目以降のデータをなんとか復元することも可能ではある。
NICのリンク速度等詳細な情報を確認する方法 [小技(Linux)]
ほとんど備忘録。なんだかその都度調べている気がするのでー。
NICのリンク速度、全二重/半二重とかその辺の情報を見たいときは ethtool を使う。
なお、mii-toolだとFastEtherまでしか対応してないくさい。
NICのリンク速度、全二重/半二重とかその辺の情報を見たいときは ethtool を使う。
[root@wisewolf ~]# ethtool eth0 Settings for eth0: Supported ports: [ TP ] Supported link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full 1000baseT/Full Supports auto-negotiation: Yes Advertised link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full 1000baseT/Full Advertised auto-negotiation: Yes Speed: 1000Mb/s Duplex: Full Port: Twisted Pair PHYAD: 1 Transceiver: internal Auto-negotiation: on Supports Wake-on: g Wake-on: g Link detected: yes
なお、mii-toolだとFastEtherまでしか対応してないくさい。
[root@wisewolf ~]# mii-tool eth0 eth0: negotiated 100baseTx-FD flow-control, link ok
非LVMなディスクパーティショニングでルートパーティションを拡張する方法 [小技(Linux)]
完全に検証をしたわけでは無いので、コレで失敗する可能性も否定できない。失敗しても全く責任は取れないので、自己責任で覚悟して試すよーに!
サーバを非LVMな状態でセットアップした場合に、ルートパーティションを拡張する方法をあれこれ試してみた結果、たぶんこれが最少手だろうと思われる手順をここにメモとして残しておく。
手順1:OSが入っているディスクをどうにかして大きくする。
手順2:OSをシングルユーザーモードで起動する
手順3:(コンソール操作)ルートパーティションをリードオンリーで再マウント
手順4:ルートパーティションを一旦削除し、再作成する
手順5:OSを再起動する(マルチユーザーモードにして構わない)
手順6:resize2fsでパーティション拡張
手順1:OSが入っているディスクをどうにかして大きくする。
VMwareな環境でテストしたので、HardDiskの大きさの設定を好きなだけ大きくする。
あ、そのまえに、ゲストOSは電源断状態にね。
手順2:OSをシングルユーザーモードで起動する
GRUBでkernelのパラメータに「single」を追記して起動。
手順3:(コンソール操作)ルートパーティションをリードオンリーで再マウント
mount -o remount,ro /
とすれば、rwモードからroモードに変更される。
手順4:ルートパーティションを一旦削除し、再作成する
fdiskの場合ね。
/dev/sda3がルートパーティションという環境なので、以下のとおり実行
fdisk /dev/sda
と実行してから、fdiskコマンドのコマンドで
d
3
と実行してsda3を一旦削除。そのまま続けて
n
p
3
あとはEnterキーを連打連打。fdiskのコマンドプロンプトに戻るまでEnter入力。
なお、sda3パーティションがそのディスクの「一番最後のパーティション」である必要がある。パーティションを削除する際には、削除前のパーティションの「開始シリンダー」の値をチェックし、再作成する際も同じシリンダーから開始しなければならない。
pコマンドなどでパーティションテーブルを参照して問題が無ければ
wでfdiskを終了する。
手順5:OSを再起動する(マルチユーザーモードにして構わない)
syncしてrebootしる。
手順6:resize2fsでパーティション拡張
resize2fs -f /dev/sda3
でルートパーティションを拡張する。「-f」は最初省略して実行してみて、「e2fsckしる!」って言われたら-fつけて再実行がいいかもしれない。
なお、この方法で当方は何度か成功していて失敗事例は全く無い。
が、失敗したとしても当方は一切関知しない。諸君らの成功に期待する…
サーバを非LVMな状態でセットアップした場合に、ルートパーティションを拡張する方法をあれこれ試してみた結果、たぶんこれが最少手だろうと思われる手順をここにメモとして残しておく。
手順1:OSが入っているディスクをどうにかして大きくする。
手順2:OSをシングルユーザーモードで起動する
手順3:(コンソール操作)ルートパーティションをリードオンリーで再マウント
手順4:ルートパーティションを一旦削除し、再作成する
手順5:OSを再起動する(マルチユーザーモードにして構わない)
手順6:resize2fsでパーティション拡張
手順1:OSが入っているディスクをどうにかして大きくする。
VMwareな環境でテストしたので、HardDiskの大きさの設定を好きなだけ大きくする。
あ、そのまえに、ゲストOSは電源断状態にね。
手順2:OSをシングルユーザーモードで起動する
GRUBでkernelのパラメータに「single」を追記して起動。
手順3:(コンソール操作)ルートパーティションをリードオンリーで再マウント
mount -o remount,ro /
とすれば、rwモードからroモードに変更される。
手順4:ルートパーティションを一旦削除し、再作成する
fdiskの場合ね。
/dev/sda3がルートパーティションという環境なので、以下のとおり実行
fdisk /dev/sda
と実行してから、fdiskコマンドのコマンドで
d
3
と実行してsda3を一旦削除。そのまま続けて
n
p
3
あとはEnterキーを連打連打。fdiskのコマンドプロンプトに戻るまでEnter入力。
なお、sda3パーティションがそのディスクの「一番最後のパーティション」である必要がある。パーティションを削除する際には、削除前のパーティションの「開始シリンダー」の値をチェックし、再作成する際も同じシリンダーから開始しなければならない。
pコマンドなどでパーティションテーブルを参照して問題が無ければ
wでfdiskを終了する。
手順5:OSを再起動する(マルチユーザーモードにして構わない)
syncしてrebootしる。
手順6:resize2fsでパーティション拡張
resize2fs -f /dev/sda3
でルートパーティションを拡張する。「-f」は最初省略して実行してみて、「e2fsckしる!」って言われたら-fつけて再実行がいいかもしれない。
なお、この方法で当方は何度か成功していて失敗事例は全く無い。
が、失敗したとしても当方は一切関知しない。諸君らの成功に期待する…
CentOSインストール後に後からGNOMEをインストールする [小技(Linux)]
サーバにCentOSがインストールされている状態、しかもパッケージ類は最小のインストール状態からウィンドウシステムを入れるにはどうしたらいいか…というのを試してみる。
GNOMEを入れてみようかと思うけど、GNOMEを入れる環境としてチョイスしたのは
CentOS5.5をテキストモードでインストール
インストール時のパッケージは「Base」のみ
最終的な目標としては
1.GNOMEをインストールする
2.最低でもWebブラウジングとメールの読み書きができる
3.日本語が使える(読める、入力できる)
4.多少面倒くさくても、できるだけ最小のインストールパッケージで
というあたりに設定してみる。
が、ひとまずは「簡単確実に」GNOMEをインストールしてみることにする。
yumの「groupinstall」を使うのがラクチンポンであったりする。コレを使えば、必要なパッケージを全部まとめてインストールできる。(…ゆえに、いらないよなあ~というものまで入ってしまうのだけども。)
ちなみに、どんなパッケージグループが使えるのか調べるには、
yum grouplist
で調べられる。今想定している環境ではこんな状態。
ターミナルが日本語環境なので日本語で出てくるが、なんとインストールグループの指定にはこの日本語が指定できてしまうのであった。(笑)
では、GNOMEをインストールするには…
yum groupinstall "GNOME デスクトップ環境" "X Window System"
である。コマンドラインに日本語を記述するのは微妙に気持ちが悪い。(笑)
なお、「GNOME デスクトップ環境」や「X Window System」という文字列は必ずダブルクォーテーション「"」で囲むように。なぜなら空白文字が含まれているからである。
これで、「y」を押せば必要なパッケージがぜーーーーーーんぶインストールされる。
インストールが終わったら、/etc/inittabを編集。
善良なサーバであれば id:3:initdefault: と、なっているであろう箇所を、 id:5:initdefault: という具合に邪悪な設定に変更する。
あとはリブート。このまましばらく待てば、「日本語は表示される」という状態にはなる。
ところが、「日本語が入力できる」という状態にない。(笑)
そこで、日本語入力のセットアップを行う必要がある。
どういうわけか、「日本語変換エンジン」は入っているのに、入力メソッドが入っていない状態のようだ。(笑)そこで調べてみるとAnthy+scimだったらラクチンそうだ。
GNOMEが起動したらログインし、「アプリケーション」→「アクセサリ」→「GNOME端末」とクリックしてターミナルを起動。ターミナルで yum install scim-anthy を実行すると入力メソッドがインストールされる。
日本語入力方法はデフォルトのままだとCtrlキーを押しながらSpaceキーなので、Windowsに毒された人にはちょっと使いづらいかもしれない。そこで、「システム」→「他の個人設定」→「SCIM入力メソッドの設定」でかな漢字入力のON/OFFを変更できる。
Altキー+半角/全角キーなどにも変更できるのでお試しあれ。
なお、SCIM入力メソッドのキー割り当てを変更した場合、GNOME自体を再起動しないと変更がうまく反映されない現象が発生するようなので、確実に反映させたい場合はCtrlキー+Altキー+BackspaceキーでGNOMEを再起動したほうが手っ取り早いみたい。
続いて、ブラウザをインストールしよう。
(残念ながら私の嫌いな)Firefoxであればyumでさっくりインストールできるようだ。インストールは簡単で、yum install firefoxでよい。インストール後はデスクトップ上側のバーにある「GNOME ウェブ・ブラウザ」アイコンがちゃんと機能するようになる。
Firefoxの使い方は…別に説明しなくてもいいよね…。私も人に説明できるほどは詳しくないので。(大笑)
なお、「アプリケーション」→「インターネット」→「Firefox Web Browser」でも起動できる。
最後にメールクライアントソフト。
yumでさくっとインストールできるのはThunderbirdだ。yum install thunderbirdでインストール。インストールが完了すれば、「アプリケーション」→「インターネット」→「Thunderbird Email」で起動できる。
なお、シャットダウンしたい場合は、「システム」→「シャットダウン」とクリックすればよい。ターミナルからshutdownをしてもよいが、ウィンドウアプリケーションのデータが破棄されてしまうので要注意。
しかし…
パッケージを330個以上インストールしてるんで、もうちょっとどうにかなりませんかねー?というのが個人的な感想。ここから、「必要なものだけをインストールする方法」を探るのであった…。
(たぶんつづく!!)
GNOMEを入れてみようかと思うけど、GNOMEを入れる環境としてチョイスしたのは
CentOS5.5をテキストモードでインストール
インストール時のパッケージは「Base」のみ
最終的な目標としては
1.GNOMEをインストールする
2.最低でもWebブラウジングとメールの読み書きができる
3.日本語が使える(読める、入力できる)
4.多少面倒くさくても、できるだけ最小のインストールパッケージで
というあたりに設定してみる。
が、ひとまずは「簡単確実に」GNOMEをインストールしてみることにする。
yumの「groupinstall」を使うのがラクチンポンであったりする。コレを使えば、必要なパッケージを全部まとめてインストールできる。(…ゆえに、いらないよなあ~というものまで入ってしまうのだけども。)
ちなみに、どんなパッケージグループが使えるのか調べるには、
yum grouplist
で調べられる。今想定している環境ではこんな状態。
[root@test791 ~]# yum grouplist Loaded plugins: fastestmirror Setting up Group Process Loading mirror speeds from cached hostfile * addons: www.ftp.ne.jp * base: www.ftp.ne.jp * extras: www.ftp.ne.jp * updates: centosk3.centos.org Installed Groups: Yum Utilities システムツール ダイヤルアップネットワークサポート ネットワークサーバー メールサーバー Available Groups: Beagle DNS ネームサーバー Emacs FTP サーバー FreeNX and NX GNOME ソフトウェア開発 GNOME デスクトップ環境 Horde Java Java 開発 KDE ( K デスクトップ環境) KDE ソフトウェア開発 KVM Mono MySQL データベース Office/生産性 OpenFabrics Enterprise ディストリビューション PostgreSQL データベース Ruby Tomboy Web サーバー Windows ファイルサーバー X Window System X ソフトウェア開発 XFCE-4.4 エディタ クラスタストレージ クラスタリング グラフィカルインターネット グラフィクス ゲームと娯楽 サウンドとビデオ サーバー設定ツール テキストベースのインターネット ニュースサーバー ベース レガシーなソフトウェアのサポート レガシーなソフトウェアの開発 レガシーなネットワークサーバー 仮想化 印刷サポート 技術系と科学系 管理ツール 著作と発行 開発ツール 開発ライブラリ Done
ターミナルが日本語環境なので日本語で出てくるが、なんとインストールグループの指定にはこの日本語が指定できてしまうのであった。(笑)
では、GNOMEをインストールするには…
yum groupinstall "GNOME デスクトップ環境" "X Window System"
である。コマンドラインに日本語を記述するのは微妙に気持ちが悪い。(笑)
なお、「GNOME デスクトップ環境」や「X Window System」という文字列は必ずダブルクォーテーション「"」で囲むように。なぜなら空白文字が含まれているからである。
[root@test791 ~]# yum groupinstall "GNOME デスクトップ環境" "X Window System" Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile * addons: www.ftp.ne.jp * base: www.ftp.ne.jp * extras: www.ftp.ne.jp * updates: centosk3.centos.org Setting up Group Process Checking for new repos for mirrors Package 1:xorg-x11-xfs-1.0.2-4.x86_64 already installed and latest version Package bitstream-vera-fonts-1.10-7.noarch already installed and latest version Resolving Dependencies --> Running transaction check ---> Package NetworkManager-gnome.x86_64 1:0.7.0-10.el5_5.1 set to be updated --> Processing Dependency: gnome-keyring for package: NetworkManager-gnome --> Processing Dependency: gnome-icon-theme for package: NetworkManager-gnome --> Processing Dependency: libgnome-keyring.so.0()(64bit) for package: NetworkManager-gnome (省略) xorg-x11-server-utils x86_64 7.1-4.fc6 base 171 k xorg-x11-utils x86_64 7.1-2.fc6 base 123 k xorg-x11-xkb-utils x86_64 1.0.2-2.1 base 183 k xsri x86_64 1:2.1.0-10.fc6 base 31 k xulrunner x86_64 1.9.2.9-1.el5 updates 11 M zenity x86_64 2.16.0-2.el5 base 1.2 M Transaction Summary ============================================================================================================================= Install 337 Package(s) Upgrade 0 Package(s) Total download size: 242 M Is this ok [y/N]:
これで、「y」を押せば必要なパッケージがぜーーーーーーんぶインストールされる。
インストールが終わったら、/etc/inittabを編集。
善良なサーバであれば id:3:initdefault: と、なっているであろう箇所を、 id:5:initdefault: という具合に邪悪な設定に変更する。
あとはリブート。このまましばらく待てば、「日本語は表示される」という状態にはなる。
ところが、「日本語が入力できる」という状態にない。(笑)
そこで、日本語入力のセットアップを行う必要がある。
どういうわけか、「日本語変換エンジン」は入っているのに、入力メソッドが入っていない状態のようだ。(笑)そこで調べてみるとAnthy+scimだったらラクチンそうだ。
GNOMEが起動したらログインし、「アプリケーション」→「アクセサリ」→「GNOME端末」とクリックしてターミナルを起動。ターミナルで yum install scim-anthy を実行すると入力メソッドがインストールされる。
日本語入力方法はデフォルトのままだとCtrlキーを押しながらSpaceキーなので、Windowsに毒された人にはちょっと使いづらいかもしれない。そこで、「システム」→「他の個人設定」→「SCIM入力メソッドの設定」でかな漢字入力のON/OFFを変更できる。
Altキー+半角/全角キーなどにも変更できるのでお試しあれ。
なお、SCIM入力メソッドのキー割り当てを変更した場合、GNOME自体を再起動しないと変更がうまく反映されない現象が発生するようなので、確実に反映させたい場合はCtrlキー+Altキー+BackspaceキーでGNOMEを再起動したほうが手っ取り早いみたい。
続いて、ブラウザをインストールしよう。
(残念ながら私の嫌いな)Firefoxであればyumでさっくりインストールできるようだ。インストールは簡単で、yum install firefoxでよい。インストール後はデスクトップ上側のバーにある「GNOME ウェブ・ブラウザ」アイコンがちゃんと機能するようになる。
Firefoxの使い方は…別に説明しなくてもいいよね…。私も人に説明できるほどは詳しくないので。(大笑)
なお、「アプリケーション」→「インターネット」→「Firefox Web Browser」でも起動できる。
最後にメールクライアントソフト。
yumでさくっとインストールできるのはThunderbirdだ。yum install thunderbirdでインストール。インストールが完了すれば、「アプリケーション」→「インターネット」→「Thunderbird Email」で起動できる。
なお、シャットダウンしたい場合は、「システム」→「シャットダウン」とクリックすればよい。ターミナルからshutdownをしてもよいが、ウィンドウアプリケーションのデータが破棄されてしまうので要注意。
しかし…
パッケージを330個以上インストールしてるんで、もうちょっとどうにかなりませんかねー?というのが個人的な感想。ここから、「必要なものだけをインストールする方法」を探るのであった…。
(たぶんつづく!!)
ファイルだけ・ディレクトリだけ、パーミッションを変更したい [小技(Linux)]
習うより慣れろfindコマンド応用術
chown -R みたいに、chmodにも-Rオプションがあったりしますが、実はコイツがビミョーに使いづらかったりするんですよね。
例えば、パーミッションが「drwxr-xr-x」というディレクトリが沢山あるとして、オーナーでもグループメンバーでもない人のそのディレクトリへの立ち入りを禁止したいという場合に、それを再帰的に実行したいなーとかいうケース。
chmod o-x somewhere
(「somewhere」はどこかのディレクトリ)と実行すれば、ひとまずそのディレクトリから「x」が取り除かれるのである。よって、再帰的に実行したいなら、「-R」をつければいいし、カレントディレクトリに複数あるなら「*」と指定したくなる。
chmod -R o-x ./*
とか、実行したくなる気持ちは理解できる。
が、これでは痛い目にあう可能性があることに気が付くだろうか。
もしそこに…
実行可能なファイル(コマンドやスクリプト)が含まれていたら、なにか余計なことをしでかす予感がしないだろうか。(笑)
こんなケースでもfindコマンドが役に立つ。
「ディレクトリだけターゲットにしたい」なら…
find /some-directory -type d -exec chmod o-x {} \;
と、なる。これでディレクトリだけが処理の対象になるし、「ファイルだけターゲットにしたい」なら…
find /some-directory -type f -exec chmod o-x {} \;
と、いうことに。
ちなみに、前アーティクルの「特定のオーナーの…」という条件を組み合わせることも可能で、
find /some-directory -type f -user someOwner -exec chmod o-x {} \;
と、これで「オーナーがsomeOwner」のファイルだけchmodする…ということが可能になる。
もちろん、「-maxdepth」とかも組み合わせることができる。
chown -R みたいに、chmodにも-Rオプションがあったりしますが、実はコイツがビミョーに使いづらかったりするんですよね。
例えば、パーミッションが「drwxr-xr-x」というディレクトリが沢山あるとして、オーナーでもグループメンバーでもない人のそのディレクトリへの立ち入りを禁止したいという場合に、それを再帰的に実行したいなーとかいうケース。
chmod o-x somewhere
(「somewhere」はどこかのディレクトリ)と実行すれば、ひとまずそのディレクトリから「x」が取り除かれるのである。よって、再帰的に実行したいなら、「-R」をつければいいし、カレントディレクトリに複数あるなら「*」と指定したくなる。
chmod -R o-x ./*
とか、実行したくなる気持ちは理解できる。
が、これでは痛い目にあう可能性があることに気が付くだろうか。
もしそこに…
実行可能なファイル(コマンドやスクリプト)が含まれていたら、なにか余計なことをしでかす予感がしないだろうか。(笑)
こんなケースでもfindコマンドが役に立つ。
「ディレクトリだけターゲットにしたい」なら…
find /some-directory -type d -exec chmod o-x {} \;
と、なる。これでディレクトリだけが処理の対象になるし、「ファイルだけターゲットにしたい」なら…
find /some-directory -type f -exec chmod o-x {} \;
と、いうことに。
ちなみに、前アーティクルの「特定のオーナーの…」という条件を組み合わせることも可能で、
find /some-directory -type f -user someOwner -exec chmod o-x {} \;
と、これで「オーナーがsomeOwner」のファイルだけchmodする…ということが可能になる。
もちろん、「-maxdepth」とかも組み合わせることができる。
特定のディレクトリから再帰的に特定のオーナーのファイルやディレクトリだけchownしたい [小技(Linux)]
習うより慣れろfindコマンド応用術
例えば、/home/hoge/ディレクトリの下にある全てのファイルやディレクトリのオーナーを変更したい!という場合は単純に
chown -R newOwner /home/hoge/*
と、実行すればよい。別に難しい話ではない。
ところが、例えば会社などで「○○さんが退職したので、業務を××さんが引き継いだ。ファイルのオーナーも、○○さんのファイルだけ××さんに移管したい」というケースがたまーーーーーーーーーーーーーにあるかもしれない。無いかもしれない。
そんなときに、上記のようなchownコマンドでは甚だ都合が悪いことも出てくる。というのも、上記の例では「/home/hoge/」配下にある全てのファイルやディレクトリのオーナーを片っ端からnewOwnerに変更してしまうので、移管したくない「△△さん」のファイルなどがあっても、それらも関係なしにchownされてしまうのである。
このように、再帰的だがファイルやディレクトリの条件次第で実行したりしなかったりするケースがある場合に、findコマンドが役に立つ。
ここでは、oldOwnerをnewOwnerに変更する例を示す。
find /some-directory -user oldOwner -exec chown newOwner {} \;
findコマンドで検索されたファイル名が、「{}」の部分に代入されてchownコマンドが実行される。
なお、-execオプションの替わりに、xargsコマンドでつなげてもよい。
find /some-directory -user oldOwner -print | xargs chown newOwner
とかこんな具合。こちらの例では、findコマンドが条件にマッチしたファイルをいったん標準出力に出力すると、パイプを経由してxargsコマンドがそれを受け取り、chownコマンドを各々起動するとかいう具合になる。
なお、どちらのケースでもchown コマンドに -R オプションはつけないこと!!
追記:
「特定のオーナーのファイルだけオーナーを変更したいんだけど、カレントディレクトリだけやってくれれば十分で、再帰的に実行してほしくないんだけど…」という場合、findコマンドに「-maxdepth 1」というオプションを追加すれば解決する。
find /some-directory -maxdepth 1 -user oldOwner -exec chown newOwner {} \;
このとき、「-user」オプションの前に「-maxdepth 1」を記述しないと、警告メッセージが出てくるので要注意。
例えば、/home/hoge/ディレクトリの下にある全てのファイルやディレクトリのオーナーを変更したい!という場合は単純に
chown -R newOwner /home/hoge/*
と、実行すればよい。別に難しい話ではない。
ところが、例えば会社などで「○○さんが退職したので、業務を××さんが引き継いだ。ファイルのオーナーも、○○さんのファイルだけ××さんに移管したい」というケースがたまーーーーーーーーーーーーーにあるかもしれない。無いかもしれない。
そんなときに、上記のようなchownコマンドでは甚だ都合が悪いことも出てくる。というのも、上記の例では「/home/hoge/」配下にある全てのファイルやディレクトリのオーナーを片っ端からnewOwnerに変更してしまうので、移管したくない「△△さん」のファイルなどがあっても、それらも関係なしにchownされてしまうのである。
このように、再帰的だがファイルやディレクトリの条件次第で実行したりしなかったりするケースがある場合に、findコマンドが役に立つ。
ここでは、oldOwnerをnewOwnerに変更する例を示す。
find /some-directory -user oldOwner -exec chown newOwner {} \;
findコマンドで検索されたファイル名が、「{}」の部分に代入されてchownコマンドが実行される。
なお、-execオプションの替わりに、xargsコマンドでつなげてもよい。
find /some-directory -user oldOwner -print | xargs chown newOwner
とかこんな具合。こちらの例では、findコマンドが条件にマッチしたファイルをいったん標準出力に出力すると、パイプを経由してxargsコマンドがそれを受け取り、chownコマンドを各々起動するとかいう具合になる。
なお、どちらのケースでもchown コマンドに -R オプションはつけないこと!!
追記:
「特定のオーナーのファイルだけオーナーを変更したいんだけど、カレントディレクトリだけやってくれれば十分で、再帰的に実行してほしくないんだけど…」という場合、findコマンドに「-maxdepth 1」というオプションを追加すれば解決する。
find /some-directory -maxdepth 1 -user oldOwner -exec chown newOwner {} \;
このとき、「-user」オプションの前に「-maxdepth 1」を記述しないと、警告メッセージが出てくるので要注意。