ssh経由でディレクトリを圧縮して送る

Posted on
サーバ管理

リモートサーバにあるディレクトリをバックアップしたい。ただ、そのリモートサーバのディスク容量が少ないので、サーバ上でディレクトリ以下を一旦圧縮してから別のところに転送できない。 そこで、sshでリモートサーバ上でtar等のコマンドを実行して、手元のPCに圧縮データを送ることにした。

% ssh user@remote "tar -cJf - 圧縮したいディレクトリ" > backup.tar.xz

で、リモートサーバ上でtarを実行して、ローカルPCにファイルを転送できる。 オプションでJを付けているから、xzで圧縮した状態で転送される。転送量が減って大変エコである。

今回は圧縮したいディレクトリの中に、別ユーザのファイルが含まれていたので、sudoを使う必要があった。

% ssh user@remote "sudo tar -cJf - 圧縮したいディレクトリ" > backup.tar.xz

とやると、

sudo: no tty present and no askpass program specified

と出て、実行できなかった。 terminalが見つからないか、askpassというプログラムが無い、というエラー。 ここによると、環境変数SSH_ASKPASSに何らかのプログラムを付け加えればいいらしいが、今回はセキュリティ的によくなさそうだが、簡易な方法を取った。

% sudo visudo

で最後の方に下記を追加する。userはログインユーザ名に読み替える。

user ALL=(ALL) NOPASSWD:ALL

これでuserは、パスワードなしでsudoできるようになる。

% ssh user@remote "sudo tar -cJf - 圧縮したいディレクトリ" > backup.tar.xz

を実行すると、リモートサーバのディレクトリを圧縮して、ローカルPCにデータを転送できる。

参考URL

https://orebibou.com/2015/02/ssh%E7%B5%8C%E7%94%B1%E3%81%A7%E3%81%AEtar%E3%81%AB%E3%82%88%E3%82%8B%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%81%AE%E5%9C%A7%E7%B8%AE%E3%83%BB%E8%A7%A3%E5%87%8D%E6%96%B9%E6%B3%95/