More from: linux

複数ファイル内の特定文字列の一括変換

Linuxで稼働させているサーバに置いてある特定のファイル群の内容を一部書き換える必要が生じた。
書き換える内容は特定の文字列を別の文字列に変換するだけなんだけど、なにせ書き換えが必要なファイルが数百個もある。
手作業で編集するには多すぎるので、なんか自動で出来ないかな?と思い調べてみると同じことを考える人はいるもので、ヒントどころか回答そのものがすぐに見つかった。
手順は一行のコマンド(実際にはパイプで接続した二つのコマンド)で非常に単純。
$grep -l ‘置換対象の文字列’ 置換対象のファイル群 | xargs sed -i.bak -e ‘s/置換対象の文字列/置換後の文字列/g’
要は書き換えが必要なファイルをgrepで探し出し、それをパイプでsedに渡すんだけど、その際にファイル名をパラメータで渡すためにxargsコマンドを使用している。
実際にやってみるとあっというまに数百個のファイルの編集が完了、いやぁ助かったなぁ(汗)。

←クリックしてくれると嬉しいです。

cronファイルの場所

linuxサーバのユーザーの移行に伴って、各ユーザーのcrontabの内容を確認する必要があった。
一人や二人ならそのユーザーでログインするか、スーパーユーザーでcrontab ユーザー名 -eで確認するんだけど、数十人分なのでちょっと面倒。
なので各ユーザーのcrontabの内容がどこにあるかをググって見たらすぐに見つかった。
/var/spoo/cron
というディレクトリにユーザー名のファイルがあって、その中身がcrontab -eで編集しているファイルそのもの。
所有権を見ると600だけど、スーパーユーザーならcatコマンドで中身を見ることは可能。
あー、これで楽になったなぁ。

←クリックしてくれると嬉しいです。

サーバ間のメール転送が上手くいかない・・・

メールサーバの移行に伴い、新旧サーバ間でのメールの転送が必要になった。
具体的には新サーバの特定ユーザー宛のメールを旧サーバに転送することになる。
そこで該当ユーザーの”.forward”ファイルに転送先の旧サーバのアドレスを書いたのだけど、
「sendmail deferred connection refused by XXX」(XXXは送信先、要は旧サーバ名)
のエラーとなり送信出来ない。
それもその筈、旧サーバは当初外部からのsmtp接続を受け付ける必要が無かったので、”sendmail.cf”の
「O DaemonPortOptions=Port=smtp,Addr=127.0.0.1, Name=MTA」
という項目がデフォルトのままだったために、外部からのsmtp接続を拒否していた。
ここにもう一行
「O DaemonPortOptions=Port=smtp,Addr=aaa.bbb.ccc.ddd, Name=MTA」(aaa.bbb.ccc.dddは自サーバの実際のIPアドレス)
という行を追加し、sendmailを再起動することで回避出来た。
ところがその後も新サーバ側からメールを送ると、
”553 5.3.5 system config error”
とか
”553 5.3.5 xxx.yyy.zzz. config error: mail loops back to me (MX problem?)”
というエラーが出てやはり送信出来ない(汗)。
これらのエラーは”/etc/mail/local-host-names”ファイルに関係する全てのサーバ名(ホスト名、ホスト名+ドメイン名)を追加で記述しsendmailを再起動することで解消出来た。
また
”Relaying denied”
も出ていたので、これは”/etc/mail/access”ファイルにリレーを受け付けるホスト(要は新サーバ)のIPアドレス+”RELAY”を記述し、makeし直すことで解決した。

上記の設定変更でようやく新サーバから旧サーバへのメールの転送が可能になったので、ようやく落ち着いたよ(汗)。

←クリックしてくれると嬉しいです。

telnetで接続できなくなった(汗)

職場のメール受信用サーバが最近調子が悪いので新たに構築したサーバに移行中。
ところが移行作業二日目の朝になるとPCからtelnetでサーバに接続しようとすると、
「getaddrinfo: localhost Name or service not known Connection closed by foreign host.」
というエラーメッセージが出て接続できなくなってしまった。
早速このエラーメッセージでググって見ると、どうも/etc/hostsファイルの記述(だけでは無いらしいが)に問題があるようだ。
そこを修正すればOKらしいんだけど、作業をするにはコンソールからログインしなければならない。
サーバを設置してある部屋に行って/etc/hostsファイルを見ると、/etc/sysconfig/networkファイルに書いてあるホスト名と異なっていた(汗)。
さっそく/etc/hostsファイル内のホスト名を書き直すとtelnetでの接続が復活した。
うーん、前日の作業で修正を間違っていたのかなぁ???

←クリックしてくれると嬉しいです。

ユーザーパスワードをシェルスクリプトで設定

サーバー上のユーザーアカウントを別サーバーに移行する必要が生じた。
サーバー自体をまるごとコピーすれば簡単なんだけど、OSのバージョンを新しくしたサーバーへの移行なのでそれが出来ない。
つまり新しいサーバー上でユーザーアカウントを新たに作成しなければならない。
いや、/etc/passwdや/etc/shadowや/etc/groupの必要部分をコピーする方法もあるんだけど、OSのバージョンがかなり違ってちょっと怖いので今回はやらないつもり(汗)

ユーザーの作成そのものは以前書いた「ユーザー設定の移行(備忘録)」の手順で行えば良いのだけど、この記事を書いた時はパスワードの設定をどうすれば簡略化出来るか判らなかった。
その後調べていたら、
# echo [パスワード] | passwd –stdin [ユーザ名]
とすれば、コマンドラインから一発でパスワードを入力できることが判ったので、これを移行するユーザー分だけスクリプトに書いて実行すれば楽に出来るなぁ。

←クリックしてくれると嬉しいです。

VAIOにubuntuを入れてみた

昨日書いたけど、VAIOノート「VGN-G2AAPS」にubuntuをインストールしてみた。
メモリが1.5GBしかないので、インストールしたのは日本語 RemixのUbuntu 14.04の32bit版。
インストール自体はイメージを焼いたDVDを入れて起動し、あとは殆ど画面の指示に従って行えば特に問題無く出来た。
動作も古いハードウェアの割にはスムースで、FirefoxやLibre Officeのアプリの動作もそれほど重いとは感じなかった。
元々それほど重たい処理をさせるつもりの無いサブのサブみたいなノートだから、これはこれでそこそこ使えそうだな。

←クリックしてくれると嬉しいです。

VAIOにubuntu

ひょんなことで手元に来たSONYの小型ノートPC「VGN-G2AAPS」。
インストールされているOSがWindowsXPなので、このままではちょっと使えない。
そこでデスクトップ用のLinuxでも入れてみようかと思い、ちょっと試してみた。
試してみたのはubuntuの15.10で、配布サイトからDVDイメージをダウンロードしてDVDに焼き、VAIOに入れてDVDから起動してみた。
ubuntuはインストールDVDから起動すると”お試し”が出来るので、先ずはインストールせずに試してみたところ、Xの起動に時間がかかったがこれはモジュールをDVDから読み込んでいるためである程度は仕方が無い。
一度Xが起動するとワードプロセッサー(Libre Office Writer)も、ブラウザ(Firefox、ubuntu browser)もそこそこ動いてくれた。
なにせCPUがCore2DuoのU7600(超低電圧版1.2GHz動作:Meromコア)でメモリが1.5GB(オンボード512MB、増設1GB)という一昔も二昔も前のスペックなのに、そこそこ動いてくれるのは良い。
今回試したのは64bit版だけど、メモリが1.5GBしか無いので32bit版でも良い(というかメモリ2GB以下は32bit版が推奨されている)から、インストールするなら32bit版だろうなぁ。
ただ、日本語 RemixのイメージはUbuntu 14.04までしか無く、それより新しい15.10とかは64bit版しか無い。
ただサポート期間は14.04のほうが長く2019年4月まで(15.10は2016年7月まで)らしいので、入れるならこれなのかな?

←クリックしてくれると嬉しいです。

ユーザー設定の移行(備忘録)

仕事で使っているサーバの負担が大きくなってきたので、処理を分散させるために仮想でもう一台作った。
新しいサーバに一部の処理を移行させるのだけど、やっているのがメールの代理受信なので、ユーザーデータも移行しなければならない。
スプールの中身は移さずに全て受信後に新しいサーバに移行して貰うつもり。
なので新しいサーバでユーザーを新たに登録する作業が必要で、いちいち手作業でやっていてはミスが出るので元のサーバのユーザー情報を元に登録用のスクリプトを作った。
最初に旧サーバから/etc/passwdファイルを新サーバにコピーしておく(実際には/etc/alisesや/etc/groupファイルもコピー)。
# ”awk -F : ‘{print “/usr/sbin/useradd -u ” $3 ” -g ” $4 ” -d ” $6 ” ” $1}’ passwd > hoge”
そうして上のコマンドを実行するとファイル”hoge”の中に
/usr/sbin/useradd -u 501 -g 501 -d /home/user1 user1
のような登録用のコマンドが作られるので、後はこれを実行すればユーザーの登録が出来る(移行させたくないユーザーの分は行を削除するかマスクしておけばOK)。
問題はパスワードの設定で、一つ一つ手で入力していたら大変(ユーザー数が三桁あるので)。
これをなんとかバッチで流し込めないか現在考え中・・・
これも旧サーバの/etc/shadowファイルから切り出して流し込めれば楽なんだけどなぁ・・・
一度
useradd -u 501 -g 501 -d /home/user1 -p ”切り出したパスワード文字列(暗号化済み)” user1
でやってみたらユーザーは登録出来るけどパスワードは正しく設定されなかったorz

さて、どうしたものか???

←クリックしてくれると嬉しいです。

”ゴミ箱”機能を追加した

昨日ファイルサーバ内で大量のファイルを移動されて見えなくなった対策の一部として、ファイルサーバにゴミ箱機能を追加した。
ファイルサーバではsambaを使っているので、次のページ
「Sambaでごみ箱を使うには(Red Hat Linux編)」(@IT)
を参考に、/etc/samba/smb.confに記述を追加してユーザーが削除したファイルは実際に削除されずに指定したディレクトリに移動するようにした。
移動する際に同じ共有ドライブに移動されるとディスクスペースを圧迫してしまうので、容量に余裕のあるパーティションにゴミ箱用のディレクトリを作り、各共有ディレクトリのルートにはそこへのシンボリックリンクを張った。
試しにファイルを削除してみると無事にそのディレクトリにファイルが移動したので、ゴミ箱ディレクトリは同じファイルシステム上に無くても良いみたい。
後は削除してから一定以上の日数が経過したファイルの自動削除の仕掛けを作ればOKかな?

←クリックしてくれると嬉しいです。

たまにしか書かないと忘れるなぁ(汗)

サーバーのログの中から特定の文字列を探すのにコマンドラインから
”grep ほげ げしょ | awk ‘{print $8}’ | uniq
と書くところを、最初は
”grep ほげ げしょ | sed ‘{print $8}’ | uniq
と書いてしまい
”sed: -e 表現 #1, 文字数 3: コマンドの後ろに余計な文字があります”
というエラーを返されてしまった(汗)。
それを見ておかしいな?と思って直したのが
”grep ほげ げしょ | sed {print $8} | uniq
で、これでも同じエラーが出る(当たり前)。
そもそも”sed”を使うつもりは無く”awk”と書いているつもりなので、そこが間違っているとは気付かなかった。
2回目のエラーでようやくawkではなくてsedと書いていることに気付いて直したと言う(汗)。
いやぁ、しばらくぶりに書くと忘れてるねぇ・・・

←クリックしてくれると嬉しいです。