強力なストリーム cipher 暗号化と diffie-hellman 鍵交換を用いた安全なリモート tcp ログイン
control
と
mirror
との間で異なるファイルを、
control
から
mirror
へとコピーする。
修正時刻 (modification time) またはサイズが異なるファイルがコピーされる。
ファイルの許可属性・所有者・修正時刻・アクセス時刻
(--access-time が用いられた場合のみ)・スティッキービット・
デバイスタイプが複製される。
シンボリックリンクはリンク先の解決をされずにそのままコピーされる。
シンボリックリンクの修正・アクセス時刻 (シンボリック自身のもので、
シンボリックが指すファイルのものではないことに注意) は保存されない。
ハードリンクされたファイルは単にコピーされる。
生成時刻は、私の知る限り Unix では設定できない。
mirror
にあって
control
にないファイルやディレクトリは削除されるからである。もし
control
が完全に空の場合には、
mirror
のすべてのファイルやディレクトリが削除される。もし
mirror
が完全に空の場合には、
control
のすべてのファイルやディレクトリがコピーされる。
mirror
をディレクトリツリー
control
の完全なレプリカにし、またその際にあらゆるものを
(定期的バックアップという目的に合致するなら)
可能な限り複製しようとする。当然
mirrordir
はサブディレクトリの一番深いところまで降りていく。
ディレクトリミラーの際には、それに必要な最小の変更のみを調べ、
可能な限り効率的に動作しようとする。
control
には、何の変化も与えない。--restore-access
が与えられると、アクセス時刻は読み込みのたびに、
元の時刻に再設定される。
control
にあるコピー作業中のファイルは「共有読み込み (shared reading)」
にロックされる。これによって、
他のプロセスがそのファイルに頻繁に書き込みを行っている場合でも、
ファイルが不完全な状態や壊れた状態ではコピーされないことを保証する。
mirror
や
dest
は (たとえ空であっても) 存在していなければならない。
--help
mirror
に対してなされたファイル修正に関して、
詳しい出力をするよう指定する。
このオプションは複数個指定でき、
たくさん指定するほどより詳しく出力する。
出力は標準出力に書き出される。
--restore-access
読み込むを行うごとに、
control
のアクセス時間を元に戻す。
--access-times
control
のアクセス時刻も複製する。
--always-write
--recurs-mode
--login-mode
--copy-mode
--no-erase-directories
--erase-directories
--allow-empty-ftp-dirs
--no-allow-empty-ftp-dirs
--only-delete
-i, --ignore-next-exclude
/etc/named.boot
を決して変更したくない場合には、
mirrordir /mnt/1 /mnt/2 -i --exclude /mnt/1/etc/named.boot
とすればよい。mirror ディレクトリではなく、
control ディレクトリのフルパスで指定することに注意。
--exclude /mnt/2/etc/named.boot
では動作しない。
後者では、ファイルを削除したくない場合には
そのファイルが control ディレクトリに存在しなければならない
(たとえサイズ 0 であっても) という馬鹿げた動作となる。
--exclude path
path
を除外する。コマンドラインにたくさんの exclude パスを指定すると、
動作が遅くなってしまう。除外されたパスは、
mirror ツリーに存在する場合は削除される
(そのディレクトリまたはファイルが存在していない場合と同様である)。
これらのファイルを削除せずに無視して保持しておきたい場合は、
--ignore オプションを用いること。
--exclude-glob glob
glob
にマッチするファイルするディレクトリを除外する。
ファイルへのマッチではフルパスを用いない。
シェルにおいては、glob 表現を適切な引用符で括り、
解釈されないようにする必要がある。
--exclude-regexp regex
regex
にマッチするファイルやディレクトリを除外する。
シェルにおいては、正規表現を適切な引用符で括り、
解釈されないようにする必要がある。
--exclude-script [expr|file]
expression
の値は
INCLUDE ,
EXCLUDE ,
UNKNOWN
IGNORE
(上述の -ifP を見よ)
のいずれかであり、そのファイルに対して成すべき動作を示す。
expr
にセミコロン (;) が含まれていない場合は、
これはファイル名とみなされ、そのファイルがロードされる。
それ以外の場合は、テキストは高速化のために
逆ポーランド形式にコンパイルされる。
このオプションは複数指定でき、
その場合スクリプトは
UNKNOWN
以外の値が返るまで、順に実行される。
UNKNOWN
が返った場合は、コマンドラインにあるその他の
--exclude-
形式のオプションが効力を持つ。
インタープリタがおかしなエラーを報告したり、
セグメンテーションフォールトを起こした場合は、
その原因となったスクリプトを私に送ってほしい。
このスクリプト言語自体は、C プログラミング言語のサブセットである。
例えば以下のようなものは正しいスクリプトである。
/* PATH はファイルのフルパス名で、DIR は末尾に スラッシュ (/) の無いディレクトリ、CWD は カレントワーキングディレクトリ、dpath() は フォワードスラッシュ (/) の個数-1 を返す。*/ if (depth (DIR) - depth (CWD) > 3) { printf (%s: excluded\\n, PATH); return EXCLUDE; } else return INCLUDE;このスクリプト言語は代入演算子をサポートしない。 したがってユーザ定義変数をサポートしない。 以下の定義済みマクロを利用できる。 マクロの展開は、ディレクトリにもファイルと等しく同じように適用される。
FILE
NAME
EXTENSION
DIR
PATH
CWD
TIME
strncmp(string1, string2, integer);
glob(glob, string);
string
が glob 表現
glob
にマッチする場合は 0 を返す。
下層の実装における効率を良くしたい場合は、
あなたが書くコードでの glob 表現をひとつに限ってみること。
regexp(regexp, string);
string
が正規表現
regexp
にマッチする場合は 0 を返す。
下層の実装における効率を良くしたい場合は、
あなたが書くコードでの正規表現をひとつに限ってみること。
strstr(string1, string2);
string1
の長さの範囲に最初に現れる
string2
の位置を返す。現れない場合は 0 を返す。
以下の関数もブール値を返す。これらは
stat (2)
で説明されているマクロに対応している。
これらは、指定された条件が真の場合に非ゼロの値を返す。
S_ISLNK(integer); - ファイルはシンボリックリンク
S_ISREG(integer); - ファイルは通常のファイル
S_ISDIR(integer); - ファイルはディレクトリ
S_ISCHR(integer); - ファイルはキャラクタデバイス
S_ISBLK(integer); - ファイルはブロックデバイス
S_ISFIFO(integer); - ファイルは fifo
S_ISSOCK(integer); - ファイルはソケット
以下の関数は文字列を操作する。
strcat(string1, string2);
string1
に
string2
を連結して返す。
+
演算子も文字列を連結することに注意。
depth(string);
string
に現れるフォワードスラッシュ (/) の個数から 1 を引いたものを返す。
system(command);
command
を実行する。しかし C 言語のものとは異なり、
コマンドの終了コードを返す。
つまり、一行だけのシェルスクリプト
command
を実行する。
exec(argv0, argv1, ...);
argv0
を引数
argv1...
で実行する。
argv0
フルパスで指定しなければならない。
これは sh を経由しないので system より速い。
popen([string, ] shell_command);
shell_command
の出力を文字列として返す。
string
が与えられている場合には、その文字列を
shell_command
の標準入力に与え、成功したら 0 を返す。
以下の整数定数も利用可能で、stat.h で定義されているマクロ
(説明は
stat (2)
にある) に対応する。
S_IFMT S_IFSOCK S_IFLNK S_IFREG S_IFBLK S_IFDIR S_IFCHR S_IFIFO
S_ISUID S_ISGID S_ISVTX S_IRWXU S_IRUSR S_IWUSR S_IXUSR S_IRWXG
S_IRGRP S_IWGRP S_IXGRP S_IRWXO S_IROTH S_IWOTH S_IXOTH
以下の定数のひとつを
return
文を用いて返し、呼出し元に意図を伝える必要がある。
何も返さない場合は、返り値は
UNKNOWN
であるとみなされる。
UNKNOWN
INCLUDE
IGNORE
EXCLUDE
integer
が真 (つまり非ゼロ)
ならば
statement1 ,
statement2
などを実行し、
それ以外の場合は
statementA ,
statementB
などを実行する。
else
{...} の部分は省略可能である。
if (integer) { statement1; statement2; . . . } else { statementA; statementB; . . . }return 文は mirrordir に値を返し、スクリプトを終了させる。
return expression;exit 関数は、 mirrordir を指定した終了コードで終了させる。
exit(integer);通常 C スクリプトは、特定のファイルを除外するために用いる。 これはスクリプト言語の実装としてはやりすぎで、 機能のすべてを一般用途向けに書いたわけではない。 典型的なスクリプトは、例えばデバイスファイルを除外する、 という程度のことに留まるだろう。
if (S_ISSOCK(stat.st_mode) || S_ISFIFO(stat.st_mode) || S_ISBLK(stat.st_mode) || S_ISCHR(stat.st_mode)) { return EXCLUDE; } else return INCLUDE;--recurs-mode オプションとともに用いれば、 C スクリプトはファイルを検索するためにも利用できる ( recursdir コマンドと同じ):
/* core ファイルを全て削除する */ /* この例は 例 セクションに移動した。 */
--exclude-from file
file
に書かれているリストに含まれるパスを除外する。
空行とコメント行 (行頭の文字が # の行) は無視される。
このファイルのリストはソートされ二分木探索されるので、
たくさんのファイル名を除外したい場合には、
ここにそれらのファイルを書く方が性能は良くなる。
このオプションは複数指定でき、複数個のファイルを指定できる。
バグ:
file
の最後に与えたパスは、改行で終らなければならない。
--backup-extension level
extension
は C 形式のフォーマット文字列で、例えば .ORIG.%d
(% へのシェル代入に注意) のようにする。
level
は保存しておくリビジョンの最大数。
extension
がファイル名に追加され、古いファイルほど大きな番号を持つ。
--backup-outdate sec
sec
秒よりも古いバックアップファイルを削除する。
--nice num
num
倍の時間スリープする。したがって 1 を指定すると
(非常におおざっぱに言えば) コピーに要する時間は 2 倍になり、
3 を指定すれば 4 倍になる。
これは定期的なバックアップを、
CPU 負荷を小さくして行ないたい場合に利用するとよい。
システムによっては --nice は利用できないかもしれない。
--no-chmod
--no-chown
--mtime-threshold sec
--time-offset [[+]|-][H]H[:MM]
--test-only, --dry-run
--skip-symlinks
--keep-files
control
に無い場合でも、そのファイルを
mirror
から削除しない。こうすると
mirrordir
はある意味
cp (1)
のようになる。
--no-hard-links
--follow-symlinks
--strict-locking
--max-bytes [[ num [ k | M | G ]] | num ]
num
には
k ,
M ,
G
(大文字小文字を区別する) のいずれかを後置でき、
それぞれキロバイト、メガバイト、ギガバイトを指定する。
どれかひとつのファイルがこの数値よりも大きいと、
エラーメッセージが表示される。
--block-size
も参照のこと。
--password password
--password-exact password]
password
に指定した通りに送れるようにしている。
--test-login
--no-warn-first-login
--read-password-from-stdin
--netrc
--no-netrc
--proxy-host host
--secure
gcc
を用いている場合は、
mirrordir
のコンパイル時に
-O3 -fomit-frame-pointer -s -Wall
オプションをつけると、鍵生成が高速化される。
--key-size bits
--download-scripts
--version
International
版か
US
版かを表示する。
--download-scripts
を見よ。
-z, --gzip
deflate
する (つまり圧縮する) 時間の 2〜5 % の範囲になるように、
圧縮レベルを調整する。
--gzip-backups
--case-insensitive, --for-Robert-Seese
--to-lower
--to-upper
--no-use-passive-connections
--tar-file filename
filename
に保存する。先頭の特殊なプレフィックスと末尾のスラッシュは削除される。
すなわち
http://machine/dir/file
は
dir/file
になる。ファイル名の先頭文字が | の場合、
テキストの残りは出力がパイプされるコマンドとみなされる。
よって gzip 圧縮アーカイブは、例えば以下のようにすれば作成できる。
recursdir ftp://machine/dir --tar-file '| gzip -d > foo.tar.gz'
--tar-block-size N
--block-size bytes
--strict-mtimes
--no-mtimes
--ignore-size
--starting-file path
path
はファイルまたはディレクトリ。
path
が読まれるまでは、ファイルやディレクトリは除外ファイル
(つまり
mirror
にある場合は削除される) のように扱われる。
path
を含むディレクトリは、存在していなければ作成される。
path
が読み込まれると、ファイルやディレクトリは通常にミラーされる。
path
そのものもミラーされる。
path
またはそのサブディレクトリが存在していない場合は、
mirrordir
は直ちに終了する。
これは
mirrordir
が作業前に終了する唯一の場合である。
これは
path
が見つからない場合に、ファイルシステム全体が削除されるのを防ぐためである。
mirrordir --verbose \\ ftp://lava.obsidian.co.za/pub/mirrordir \\ /home/mirrordirあるいは
mirrordir --verbose /home/mirrordir \\ ftp://psheer@lava.obsidian.co.za/home/ftp/pub/mirrordirも動作する。ただし後者ではまずパスワードを尋ねられる。 ftp サーバに「アップロード」を行う場合は、 --strict-mtimes オプションは on にすべきでない。 ftp では修正時刻の設定はできないので、 すべてがコピーされてしまう。 (--verbose を設定すれば) mirrordir が繰り返し ftp で修正時刻とアクセス時刻をセットしようとしていることに気づくだろう。 用いている VFS のタイプにおける制限をユーザに知らせるために、 これらのメッセージは残しておくつもりである。 これらの試行は、明らかな性能の劣化としては現われない。 しかしこのプロトコルを用いたアップロードの性能が悪い場合は、代わりに mc:// を用いてみるといいだろう。 なおダウンロードは常にアップロードよりも高速である。 一般に cron ジョブでは ftp アップロードを用いるべきではない。 またディレクトリの同期を取る目的にも向いていない。 ディレクトリを同期したい場合は、反対側からのダウンロードを用いること。 アップロードは一回きりのアップロードにしか有用でない。
ミニマリスト的コピー
mirrordir -v tree tree.OLDするだけでよい。 もう一度 mirrordir を実行すれば、最小限の変更のみ (つまり更新されたファイルのみ) がコピーされる (実は cp (1) も同じことをする)。
システムバックアップ
2 台のマシンを毎時バックアップする
#!/bin/sh
# (this is just in case of any bugs I don't know about, # but I don't think it is necessary) killall -9 tee killall mirrordir >& /dev/null sleep 2 killall -9 mirrordir >& /dev/null
( \\ date ; \\ echo mirrordir says (if it said nothing it is bad): ; \\ mirrordir mc://dar1:12346/ -p abcdefg /mnt/dar1/ \\ -i --exclude-regexp '^mc://dar1:12346/var/lock/subsys/atd' \\ --exclude-regexp '^mc://dar1:12346/proc/' \\ --exclude-regexp '^mc://dar1:12346/mnt/[^/]*/.*$' \\ -i --exclude-regexp '^mc://dar1:12346/boot/' \\ -i --exclude-regexp '^mc://dar1:12346/etc/lilo.conf' \\ -C \\ \' if (S_ISDIR (stat.st_mode)) { if (!regexp (^mc://dar1:12346/[^/]*$, PATH)) printf (Backing up: %s\n, PATH); } \' ; \\ date ; \\ echo Done ; \\ ) 2>&1 \\ | tee --ignore-interrupts --append /var/log/mirrordir.log \\ | mail -s 'dar1 backup results' psheer@obsidian.co.za
安全な転送とログイン
secure-mcserv -p 12345 -dどこか外部のマシンから
copydir --secure -K 512 -z \\とすれば、512 ビットの鍵を用いた安全なファイルコピー (圧縮つき) ができる。 また
pslogin mc://alan@turing.co.uk:12345/とすれば、このマシンに安全にログインできる。
FTP サイトのミラー
mirrordir -v ftp://metalab.unc.edu/pub /home/ftp/pub
FTP 転送
copydir -v mirrordir-0.9.15.tar.gz \\ mirrordir.lsm ftp://metalab.unc.edu/incoming/Linuxとすると mirrordir を sunsite にアップロードする。 anonymous でない ftp 転送のパスワードは、標準的な ftp の慣習に従って ~/.netrc ファイルに置き、--netrc オプションを用いるのがよい。 あるいは ftp://myname@machine/ を用いてもかまわない。
ファイル探索
FTP サイトをテープにバックアップする
recursdir ftp://user@remote.machine/ \\ --exclude-regexp '//[^/]*/proc/' --tar-file /dev/mtとすればよい。
core ファイルの削除
recursdir / -C \' long l; if (strncmp (PATH, /proc, 5)) { if (S_ISREG (stat.st_mode) && !strcmp (core, FILE)) { if (strstr (popen (file + PATH), ELF 32-bit LSB core)) { l = l + stat.st_size; printf (removing: %s, cumu. total = %ldkB\\n, PATH, l >> 10); exec (rm, -f, PATH); /* could also use system() */ } } } \'
TMPDIR
0
1
2
~/.netrc
/etc/ssocket/accept.cs
/etc/ssocket/connect.cs
/etc/ssocket/arcinit.cs
/etc/ssocket/arcencrypt.cs
/etc/ssocket/private/
/etc/ssocket/public/