3

定期的に、Web サーバーの /tmp ディレクトリにファイルを置いて共有したいと思っています。厄介なのは、ファイルを scp するたびにパーミッションを設定しなければならないことです。別の質問からのアドバイスに従って、ファイルをコピーし、アクセス許可を設定してから URL を出力するスクリプトを作成しました。

#!/bin/bash

scp "$1" SERVER:"/var/www/tmp/$1"
ssh SERVER chmod 644 "/var/www/tmp/$1"
echo "URL is: http://SERVER/tmp/$1"

SERVER を実際のホストに置き換えると、スペースを含む引数でスクリプトを実行するまで、すべてが期待どおりに機能します。解決策は $@ を使用することだと思いますが、スペースを空けたファイル名を機能させる方法をまだ理解していません。

4

3 に答える 3

5

必要なのは、リモート サーバーに送信されるパスをエスケープすることであることが判明しました。Bash は、SERVER:"/var/www/tmp/$1" の引用符が $1 に関連していると考え、最終出力からそれらを削除します。実行しようとすると:

tmp-scp.sh Screen\ shot\ 2010-02-18\ at\ 9.38.35\ AM.png

実行しようとしていることがわかります。

scp SERVER:/var/www/tmp/Screen shot 2010-02-18 at 9.38.35 AM.png

代わりに、引用符がエスケープされたリテラルである場合、scp コマンドは期待どおりになります。

scp SERVER:"/var/www/tmp/Screen shot 2010-02-18 at 9.38.35 AM.png"

パスを切り捨てるコードを追加すると、最終的なスクリプトは次のようになります。

#!/bin/bash

# strip path
filename=${1##*/}
fullpath="$1"

scp "$fullpath" SERVER:\"/var/www/tmp/"$filename"\"
echo SERVER:\"/var/www/tmp/"$filename"\"
ssh SERVER chmod 644 \"/var/www/tmp/"$filename"\"
echo "URL is: http://SERVER/tmp/$filename"
于 2010-03-08T07:12:44.600 に答える
0

スクリプトは正しく見えます。ファイル名をスクリプトに渡すときに、ファイル名を引用する必要があると思います。

scp-chmod.sh "filename with spaces"

または、スペースをエスケープします。

scp-chmod.sh filename\ with\ spaces
于 2010-03-08T06:54:21.757 に答える
-4

ファイル名のスペースを気にせずに (引用以外に) より簡単な方法は、転送する前にファイルの名前を変更してスペースを取り除くことです。または、ファイルを作成するときに、スペースを使用しないでください。ファイルに名前を付けるときはいつでも、これを「ベスト プラクティス」にすることができます。

于 2010-03-08T07:28:44.653 に答える