2

SSHアクセスを公開しない共有ホストでDrupalまたはWordPressのインストールを保護する場合(お粗末な状況、fwiw)、lftpはディレクトリとファイルのアクセス許可をバッチ設定するための正しいアプローチのようです。findコマンドは、出力をリダイレクトできることを誇っています。そのため、検索を実行し、ディレクトリを意味する「/」で終わる行のみに一致するようにgrep Exclusiveを実行し、そのような一致のアクセス許可を755に設定して、逆を実行できる必要があります。ファイルが一致し、644に設定してから、settings.phpなどの特定のファイルを微調整します。

lftp prompt> find . | grep "/$" | xargs chmod -v 755 

動作しておらず、これらのコマンドを正しい順序と形式でチェーンできなかったと確信しています。

これを機能させる方法は?

更新:「機能していません」とは、上記のコマンドがコンソールにもlftpエラーログにも出力を生成しないことを意味します。これらのコマンドをローカルで実行していません、fwiw。デモとしてコマンドを減らします。

find . | grep "/$"

「find」の出力を取得し、文字列の一致の性質上、ここではディレクトリに一致するものを返します。

./daily/
./ffmpeg-installer/
./hourly/
./includes/
./includes/database/
./includes/database/mysql/
./and_so_forth_on_down

chmod(および、ftpサーバーによってサポートが異なるlftpの内部コマンド)を実行したいので、これはすばらしいことです。したがって、次のようにコマンドを展開します。

find . | grep "/$" | xargs echo

どの出力—何もありません。エラー出力もありません。grepからxargsへのパイプは発生していません。

私の目標は、以下に相当するものを形成することです。

chmod 755 ./daily/
chmod 755 ./ffmpeg-installer/

lftpでは、chmodコマンドはローカルのpermsの変更ではなく、ftp-server-permissionsの変更を実行しています。

4

1 に答える 1

2

これが期待どおりに機能しない理由の説明については、以下をお読みください-与えられた問題の解決策については、下にスクロールしてください。

答えは、のマンページにlftpあります。

「[s]一部のコマンドでは、出力(cat、ls、...)をファイルにリダイレクトしたり、パイプを介して外部コマンドにリダイレクトしたりできます。」

したがって、でリダイレクトをサポートするコマンドでこのようなパイプを使用すると、lftpその出力をローカルツールにパイプすることになり、最終的にはローカルマシンchmod上のファイル/ディレクトリのアクセス許可を変更しようとします。ローカルで現在のディレクトリに同じディレクトリレイアウトが偶然にない場合は、失敗する可能性があります。これはおそらく発生した問題です。

grep+パイプは機能しますxargs、私はちょうど以下をテストしました:

lftp> find -d 2 | grep "/$"
./
./applications/
./lost+found/
./netinfo/
./packages/
./security/
./systems/
lftp> find -d 2 | grep "/$" | xargs echo
./ ./applications/ ./lost+found/ ./netinfo/ ./packages/ ./security/ ./systems/

私の大げさな推測では、検索する最大深度を指定しておらず、パイプ内のネットワーク接続+バッファリングが邪魔になっているため、機能していないように見えました。多くのファイル/サブフォルダを含むディレクトリで同じことを試してみると、終了して印刷するのに非常に長い時間がかかります。コマンドは実際に出力なしで終了しましたか?

しかし、それでも、あなたがやろうとしていることは不可能です。私が述べたように、パイプの右側は、マニュアルで説明されているように(同じ名前の組み込みが存在する場合でも)外部コマンドで機能します。

lftp> chmod 644 foobar

lftp> echo "foobar" | xargs chmod 644

同等ではありません。はい、chmod組み込みですが、クライアントのパイプで使用されますが、組み込みは実行されません。マンページにはこれが明確に記載されており、自分で簡単にテストできます。次のコマンドを試して、出力を確認してください。

lftp> echo foo | uname -a
lftp> echo foo | ls -al
lftp> echo foo | chmod --help
lftp> chmod --help

解決

問題の解決策に関する限り、次のようなことを試すことができます。

#!/bin/bash

server="ftp.foo.bar"
root_folder="/my/path"

{
        {
                lftp "${server}" <<EOF
                cd "${root_folder}"
                find | grep "/$"
                quit
EOF
        } | awk '{ printf "chmod 755 \"%s\"\n", $0 }'

        {
                lftp "${server}" <<EOF
                cd "${root_folder}"
                find | grep -v "/$"
                quit
EOF
        } | awk '{ printf "chmod 644 \"%s\"\n", $0 }'
} | lftp "${server}"

これはサーバーにログインしcd、アクセス許可の変更を繰り返し開始するフォルダーにfind + grepログインし、すべてのディレクトリの検索に使用し、ログアウトし、このファイルリストをパイプしてその周りにコマンドawkを作成chmodし、ファイルに対してプロセス全体を繰り返してからパイプしますlftp生成されたコマンドを実際に実行するための新しい呼び出しへのコマンドの全リストchmod

また、呼び出しにクレデンシャルを追加する必要があります。実際にすべてを実行する前にlftp、ファイナルをコメントアウトして、目的の出力が生成されるかどうかを確認することをお勧めします。| lftp "${server}"これがうまくいったら、報告してください!

于 2013-04-08T19:28:55.077 に答える