SSHによるBashスクリプトの「:」文字の問題

SSHによるBashスクリプトの「:」文字の問題

私は現在、データベースセットのバックアップを実行し、圧縮し、暗号化し、別々のストレージシステムに転送し、ファイルが成功したことを確認するスクリプトを書いています。バックアップを作成し、標準の圧縮と暗号化を実行して安全に転送し、セカンダリの場所に保存できます。その後、sshターゲットコンピュータにディレクトリが存在するかどうかを確認するか、強制的に作成してファイルを転送するために使用し、scp最後にsshファイルが相手に存在することを確認します。

以前はうまく機能しましたが、ファイル名にタイムスタンプ(既存の日付スタンプに加えて)を含めるようにスクリプトが変更され、ファイル名の対応するタイムスタンプ文字が原因で:転送に失敗しましたscpsshファイル。

DATE現在、スクリプトの上部に変数を作成し、これを次のように設定しています。$(date --date=today +%FT%H:%M:%S%z)これは正しい位置に日付スタンプを生成します。ISO 8601滞在。これは、データベースダンプの作成(生成されたpostgresダンプの使用pg_dump)と圧縮gzipおよび暗号化の使用に適していますopenssl。これらのそれぞれは、フォーマットのすべての名前を持つ新しいファイルを生成しますHOSTNAME.DATABASE-dump-DATE.EXTENSION

時間なしで日付を指定すると:正しく機能するため、ファイル名に文字がありません。今表示される特定のエラーは、:文字を含む次のコードスニペットです($1バックアップするデータベース名を含むスクリプトで指定されたパラメータ参照、$ DATEは上記で定義されています)。

scp -P PORT "$(hostname).$1-dump-$DATE.backup.gz.aes" USER@HOST:"/backups/$(hostname)/"

エラーのため、この操作は失敗しましたssh: could not resolve hostname HOSTNAME.DATABASE-dump-2015-07-31T13: Name or service not known

ssh HOST -p PORT <<"HERE"
if test -f /backups/$(hostname)/$(hostname).$1-dump-$DATE.backup.gz.aes;
then echo "File exists";
else echo "Transfer failed";
fi
HERE

これは失敗しましたPseudo-terminal will not be allocated because stdin is not a terminal。を使用すると-t同じエラーが発生します-t -tスタックオーバーフロー擬似端末へのウサギの穴につながる)後で与えられた命令が流れることを許さない。

私のコンピュータにインストールする必要がある追加のソフトウェア(Ubuntu 14.04およびDB用の最新のPostgresqlの実行)を使用したくありません。scp/sshこれらのファイルを正しく処理する方法があるかどうかを教えてください。

答え1

scp -P PORT "$(hostname).$1-dump-$DATE.backup.gz.aes" USER@HOST:"/backups/$(hostname)/"

scpは、あるリモートホストから別のホストにファイルをコピーすることをサポートします。これを行うための構文は、「hostname:filename」構文を使用してソースとターゲットを指定することです。

scp srchost:/src/file desthost:/dest/file

ソースファイル名にコロンが含まれているため、scp はコロンをリモートファイルのホスト名とファイル名で解決しようとします。

パラメータの最初のコロンの前に "/"があることを確認して、scpがソースファイル名パラメータをリモートファイル名として処理するのを防ぎます。ホスト名には「/」を含めることはできません。scpは最初の「/」の後にコマンドライン引数でコロン検索を停止します。これは働きます:

scp -P PORT "./$(hostname).$1-dump-$DATE.backup.gz.aes" USER@HOST:"/backups/$(hostname)/"
             ^^-- Prepend a ref to the current directory

関連情報