3

サーバー上のいくつかのものをバックアップするためにcronを書いています。基本的に、scpを使用してローカルディレクトリから特定のファイルを送信しています。認証を回避するために公開鍵を使用しています。

再利用性のために、ローカル ディレクトリとサーバーの URL を引数で bash スクリプトに渡します。

パラメータの設定方法:

#!/bin/bash

DIR="$1"
URL="$2"
FILES="$DIR*.ext"

私の問題は、URLのフォーマットに関するものです。

フォーマットなし

ファイルをサーバーに送信する方法:

#!/bin/bash

for F in $FILEs
do
    scp $F $URL;

    if ssh $URL stat $(basename "$F")
    then
        rm $F
    else 
        echo "Fails to copy $F to $URL"
    fi
done

サーバー上のユーザーの自宅でコピーしようとすると、次のようになります。

$ ~/backup /path/to/local/folder/ user@server.com:

サーバー上の特定のディレクトリにコピーしようとすると、次のようになります。

$ ~/backup /path/to/local/folder/ user@server.com:/path/to/remote/folder/

いずれの場合も、よく知られているエラー (およびカスタム エコー) が表示されます。

ssh: Could not resolve hostname user@server.com: nodename nor [...]
Can't upload /path/to/local/folder/file.ext to user@server.com

とにかく動作します(ファイルがコピーされます)。しかし、それは解決策ではありません.scpが失敗すると(そう思われる)、ファイルが削除されることはありません。

フォーマットあり

この方法を使用してファイルを送信しようとしました:

#!/bin/bash

for F in $FILES
do
    scp $F "$URL:"
done

エラーが発生しなくなり、ユーザーのホームディレクトリにコピーしてからローカルファイルを削除することができます:

$ ~/backup /path/to/local/folder/ user@server.com

しかし、もちろん、特定のディレクトリへの送信はまったく機能しません。

ついに

したがって、最初の方法の方が適切だと思いますが、どうすればそのエラーを取り除くことができますか?

4

1 に答える 1

5

あなたの間違いは、できるができscpないuser@server.com:ということです:末尾の文字(およびその後の可能なパス)sshを削除する必要があります。パラメータ展開:を使用すると、次のように簡単に実行できます。bash

ssh "${URL%:*}" stat "$(basename "$F")"

推奨事項

于 2012-11-21T08:28:46.983 に答える