Solaris で cron の設定(crontab)をバックアップするには

cron の設定は crontab -e で行うがその設定のバックアップを取るには実体のあるパスを知りたい。 /var/spool/cron/crontab ディレクトリである。この下にユーザー毎にユーザー名でファイルがある。

2008年2月14日 · Toshimitsu Takahashi

速攻で簡単なテキストエディタ CGI を Perl で作ってみた

仕事でちょっとということで…。ファイルサーバ上のテキストファイルをブラウザから弄れたら便利だったので、速攻(正しくは即行)で作ってみた。(どっかに落ちてると思って探したものの直ぐに見つからなかったので、作ってしまった方が早そうだったから…) どこでも動かしたいので Perl にした。こんな感じです。 注意:このスクリプトはセキュリティを無視しています。間違ってもインターネットに公開しているサーバに置かないように。 editor.cgi 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 #!/usr/bin/env perl use CGI; $cgi = new CGI; $content = ""; $msg = ""; $file = $cgi->param('file'); if ($cgi->param('open')) { if (open(FH, "< $file")) { while (<FH>) { $content .= $_; } close(FH); $msg = "open $file."; } else { $msg = "not found $file."; } } elsif ($cgi->param('save')) { $content = $cgi->param('content'); if (open(FH, "\> $file")) { print FH $content; close(FH); $msg = "save $file."; } else { $msg = "failed to save $file."; } } print <<EOM; Content-Type:text/html <html> <head> <title>Text Editor</text> <style type="text/css"> #msg { color:blue; } #file { width:280px; } textarea { font-size:10.5pt; width:99%; height:95%; } </style> </head> <body> <form method="post" action="./editor.cgi"> <div> <input type="text" id="file" name="file" value="$file"/> <input type="submit" name="open" value="Open"/> <input type="submit" name="save" value="Save"/> <span id="msg">$msg</span> </div> <textarea name="content">$content</textarea> </form> </body> </html> EOM exit;

2008年2月11日 · Toshimitsu Takahashi

MySQL で後からユニークインデックスを追加するには

フィールドを Unique にする方法 mysql> alter table 対象テーブル add unique (対象フィールド); 作業ログ(フィールドサイズが 999 バイトを超えていたら) 今回 support テーブルの uri フィールドをユニーク化しようとしたが、 mysql> alter table support add unique (uri); ERROR 1071 (42000): Specified key was too long; max key length is 999 bytes となってしまった。定義を調べると、 mysql> show fields from support; +---------+---------------+------+-----+-------------------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------+---------------+------+-----+-------------------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | uri | varchar(512) | NO | MUL | | | | title | varchar(1024) | NO | MUL | | | | content | mediumtext | YES | | NULL | | | updated | timestamp | NO | | CURRENT_TIMESTAMP | | +---------+---------------+------+-----+-------------------+----------------+ 512だが、UTF-8なので超えてしまっているのだろう。 実際には数文字しか入っていないので別のフィールド uri2 を作って、そこに値をコピーしてからユニーク化して、元の列を削除してリネームすることにした。 127なら4倍しても999バイトには届かないので、varchar(127) で定義する。 ...

2008年2月9日 · Toshimitsu Takahashi

Ruby/LDAP を使って LDAP からユーザーとその所属グループのリストを生成する

Ruby/LDAP を使う。Ruby/LDAP People からユーザとそのメイングループ番号を gidNumber から取得する。 各ユーザーのメイングループの cn を取得する。 グループを全て走査して、所属するユーザーにマップをグループに追加する。 「user:group1,group2」という形式で書き出す。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 #!/usr/bin/env ruby require 'ldap' people = Hash.new LDAP::SSLConn.new("ldap.company.com") do |conn| conn.set_option(LDAP::LDAP\_OPT\_PROTOCOL_VERSION,3) bind_conn = conn.bind(バインドユーザのDN, バインドユーザのパスワード) bind_conn.search2("ou=People,dc=company,dc=com", LDAP::LDAP\_SCOPE\_SUBTREE, "uidNumber=*", \['uid', 'gidNumber'\]) { |entry| uid = entry\['uid'\].first gid = entry\['gidNumber'\].first people.store(uid, gid) } people.each do |k, v| bind_conn.search2("ou=Group,dc=company,dc=com", LDAP::LDAP\_SCOPE\_SUBTREE, "gidNumber=#{v}", \['cn'\]) { |entry| cn = entry\['cn'\].first people.store(k, \[cn\]) } end groups = Array.new bind_conn.search2("ou=Group,dc=company,dc=com", LDAP::LDAP\_SCOPE\_SUBTREE, "gidNumber=*", \['dn'\]) { |entry| entry\['dn'\].each { |e| groups.push e } } groups.each do |group| bind_conn.search2(group, LDAP::LDAP\_SCOPE\_SUBTREE, "(objectClass=*)", \['cn', 'memberUid'\]) { |entry| cn = entry\['cn'\].first uids = entry\['memberUid'\] next if uids.nil? uids = \[uids\] unless uids.is_a?(Array) uids.each { |uid| if people.key? uid people\[uid\].push(cn) end } } end end people.each do |uid, groups| print "#{uid}:" puts groups.join(",") end

2008年2月6日 · Toshimitsu Takahashi

Samba tdbsam でのユーザ追加

smb.conf 設定ファイルを見たら share は deprecated ということなので、デフォルトの tdbsam を使うことにした。 # Scurity can be set to user, share(deprecated) or server(deprecated) # Backend to store user information in. New installations should # use either tdbsam or ldapsam. smbpasswd is available for backwards # compatibility. tdbsam requires no further configuration. security = user passdb backend = tdbsam pdbedit pdbedit というコマンドで管理するらしい。ユーザを追加する。 ※予めシステムに登録されていなければならない。 $ sudo pdbedit -a -u tosshi new password: パスワード retype new password: パスワード Unix username: tosshi NT username: Account Flags: [U ] User SID: S-1-X-XX-XXXXXXXXXX-XXXXXXXXXX-XXXXXXXXX-XXXX Primary Group SID: S-1-X-XX-XXXXXXXXXX-XXXXXXXXXX-XXXXXXXXX-XXXX Full Name: Tosshi Home Directory: \\red\tosshi HomeDir Drive: Logon Script: Profile Path: \\red\tosshi\profile Domain: RED Account desc: Workstations: Munged dial: Logon time: 0 Logoff time: never Kickoff time: never Password last set: 日, 03 2月 2008 15:14:15 JST Password can change: 日, 03 2月 2008 15:14:15 JST Password must change: never Last bad password : 0 Bad password count : 0 Logon hours : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

2008年2月3日 · Toshimitsu Takahashi

Solaris 10 Zone ごとのCPU/メモリ使用率を見るためには

prstat に -Z 引数を渡すと表示される。もちろん、グローバルゾーン上で実行しないと全体は見られない。 $ prstat -Z … ZONEID NPROC SIZE RSS MEMORY TIME CPU ZONE 0 54 1109M 664M 17% 1:52:25 0.7% global 9 45 503M 232M 5.7% 2:30:41 0.1% zone01

2008年1月30日 · Toshimitsu Takahashi

Solaris 10 で rsh, rlogin を有効(無効)化するには

SMF で管理されているので svcadm で設定する。 # svcadm enable network/shell:default # svcadm enable network/login:rlogin ※無効化は svcadm disable …

2008年1月29日 · Toshimitsu Takahashi

mod_rewrite のメモ

Apache の Rewrite 機能で試してた設定をメモ書きしておく。 ある CGI から別の CGI を呼び出す /test/one.cgi?x=1&y=2… のようなリクエストを /another.cgi?x=1&y=2… と受けるには RewriteRule ^/test/one.cgi(.*)$ /another.cgi?$1 ではできない。URL引数はマッチ対象に含まれないためだ。%{QUERY_STRING} を渡せば良い。 RewriteEngine On RewriteRule ^/test/one.cgi$ /another.cgi?%{QUERY_STRING} とする。 CGI の引数を組み変えるには arg=xxxx,yyyy を user=xxxx&pass=yyyy としたい場合は RewriteEngine On RewriteCond %{QUERY_STRING} ^arg=(.),(.)$ RewriteRule ^/test/one.cgi$ /another.cgi?user=%1&pass=%2 とする。この場合は、arg=… という引数があるのが条件になっているので、付いていないとリライトは走らない。

2008年1月26日 · Toshimitsu Takahashi

Ruby で PDF を出力する CGI

pdffile のパスにある PDF を読みつつ吐き出す CGI のサンプル #!/usr/bin/env ruby pdffile = “sample.pdf” print “Content-Type:application/pdf\r\n” print “Content-Length: #{File.size(pdffile)}\r\n” print “\r\n” open(pdffile, “rb”) { |f| while buf = f.gets do print buf end }

2008年1月25日 · Toshimitsu Takahashi

bash でスクリプト名を取得するには

シェルでは $0 で実行したスクリプトファイルのパスが取れる。ここでスクリプト名だけを切り出したときはどうすればよいか。basename というコマンドを使うと切り出せる。また指定したサフィックスを取り除くことができる。 bash だとパターンマッチによる切り出しができる。 #!/bin/bash base=${0##*/} echo $base echo basename $0 echo ${base%.sh} echo basename $0 .sh を実行すると、 $ /home/toshi/shell/hoge.sh hoge.sh hoge.sh hoge hoge $ ./hoge.sh hoge.sh hoge.sh hoge hoge となる。 ※スクリプト名を切り出して何に使うのか。 ⇒例えば view と vi のように実行名によって動作を変えるときなんかに使います。

2008年1月23日 · Toshimitsu Takahashi