2017-04-17 5 views
1

Ich versuche, ein WordPress-Caching-Plugin auf allen Seiten zu installieren, die derzeit kein Caching-Plugin enthalten. Ich laufe alle cPanel-Benutzer durch, bekomme aber einige seltsame Ergebnisse, wenn ich sie ausführe. Motto ist:bash for loop keine Ergebnisse zu geben

for i in $(ls -I . -I .. /var/cpanel/users) ; do 
    WPPATH=$(find /home/$i/public_html/ -type f -name wp-config.php) 
    WPPLUGINPATH="$(echo "${WPPATH//wp-config.php/wp-content/plugins/}")" 
    cd $WPPLUGINPATH 
    [ -d $WPPLUGINPATH*cache* ] || \ 
    wp --allow-root plugin install cache-enabler --skip-plugins --skip-themes 
    sleep 3 
    chown -R $i: $WPPLUGINPATH 
    echo $WPPLUGINPATH 
done 

Es funktioniert für die meisten aber immer zufällige Hits wie:

/home/userC/public_html/wp-content/plugins/ 
Error: This does not seem to be a WordPress install. 
Pass --path=`path/to/wordpress` or run `wp core download`. 
chown: missing operand after ‘userA:’ 
Try 'chown --help' for more information. 

können Sie sehen etwas weg ist als der Weg für BenutzerC noch chown Referenzierung wird erroring über userA

Es gibt auch an, dass es keine WP-Installation gibt, aber wenn ich manuell zu diesem Verzeichnis cd, kann ich den wp-cli-Befehl ausführen und das Plugin ohne Problem installieren.

Ein weiterer Fehler:

/home/userA/public_html/wp-content/plugins/ 
-bash: [: /home/userB/public_html/wp/wp-content/plugins/: binary operator expected 
Warning: cache-enabler: Plugin already installed. 
Success: Plugin already installed. 

Jede Hilfe wird sehr

+0

Sie sollten nicht verwenden 'für (ls ...' siehe [** Bash PItfalls **] (http://mywiki.wooledge.org/BashPitfalls#for_i_in_.24.28ls_.2A.mp3.29) –

+0

Auch relevant: [Warum sollten Sie nicht die Ausgabe von 'ls' analysieren] (http://mywiki.wooledge.org/ParsingLs) und [Zeilen mit 'for' nicht lesen] (http://mywiki.wooledge.org/DontReadLinesWithFor). –

+0

Verwenden Sie auch' set -x', um zu sehen, was Ihre Skripte sind tun in der Praxis, wird Ihnen im Allgemeinen helfen, bessere Fragen zu diesem Verhalten zu stellen. –

Antwort

0

Ich ging damit einen anderen Weg, da ich es nicht richtig funktionieren konnte, obwohl es von @alvits geschrieben wurde, aber es half sicherlich, also wollte ich Danke sagen.

ich nur am Ende einige Statistiken Sammeln von mehreren Servern gemeinsam eine Liste von Caching-Plugins zu setzen und kam mit:

for wppath in $(find /home/*/ \(-path mail -o -path virtfs -o -path cache \) -prune -o -type f -name wp-config.php) ; do 
     wppluginpath="${wppath//wp-config.php/}wp-content/plugins" 
     if [ -d "$wppluginpath"/cache-enabler ] || [ -d "$wppluginpath"/comet-cache-pro ] || [ -d "$wppluginpath"/hyper-cache ] || [ -d "$wppluginpath"/quick-cache ] || [ -d "$wppluginpath"/zencache ] || [ -d "$wppluginpath"/comet-cache ] || [ -d "$wppluginpath"/wp-fastest-cache ] || [ -d "$wppluginpath"/w3-total-cache ] || [ -d "$wppluginpath"/wp-super-cache ] ; then 
       echo "Found caching plugin in $wppluginpath" ; else 
       echo "No caching plugin found in $wppluginpath" 
       cd "$wppluginpath" || return 
       wp --allow-root plugin install cache-enabler --activate --skip-plugins --skip-themes 
       chown -R $(stat -c '%U' .): cache-enabler 
     fi 
done 
3

Der Fehler -bash: [: /home/userB/public_html/wp/wp-content/plugins/: binary operator expected bedeutet ersichtlich, dass der Pfadname ein Leerzeichen enthält.

In erster Linie, analysieren Sie nicht die Ausgabe von ls. Verwenden Sie stattdessen glob.

Zweitens, zitieren Sie immer Variablennamen, um Worttrennung und unbeabsichtigtes Globbing zu vermeiden. Dies ist die Ursache Ihres Problems.

Beispiel:

[ -d /path/name space/to/something.conf ] 
-bash: [: /path/name: binary operator expected 

Ihr neues Skript sollte folgendermaßen aussehen:

for i in /var/cpanel/users/*; do 
     WPPATH=$(find "/home/${i##*/}/public_html/" -type f -name wp-config.php) 
     WPPLUGINPATH="${WPPATH%/*}/wp-content/plugins/" # Useless use of echo 
     if pushd "$WPPLUGINPATH"; then 
       compgen -G "${WPPLUGINPATH}*cache*" > /dev/null || wp --allow-root plugin install cache-enabler --skip-plugins --skip-themes 
       sleep 3 
       chown -R "${i##*/}" "$WPPLUGINPATH" 
       echo "$WPPLUGINPATH" 
       popd 
     fi 
done 

Wie @Charles Duffy hat im Kommentar unten erwähnt, diese find "/home/${i##*/}/public_html/" -type f -name wp-config.php mehrere Ergebnis führen könnte. Verwenden Sie eine for-Schleife, um an jedem von ihnen zu arbeiten.

Diese Zeile [ -d "$WPPLUGINPATH"*cache* ] funktioniert nur, wenn sie auf einen einzelnen Pfadnamen erweitert wird. Verwenden Sie stattdessen bashin compgen. compgen wird die Dateinamenvervollständigung basierend auf dem Muster "${WPPLUGINPATH}*cache*" generieren. Es wird True zurückgegeben, wenn Muster generiert oder falsch sein können, wenn keine Datei mit dem Muster vorhanden ist.

Zu guter Letzt ändern Sie Ihre Angewohnheit, All-Caps-Variablen zu verwenden, um versehentlich eine Umgebungsvariable zu überschreiben.

+0

Nicht schlecht, trifft die notwendigen Höhepunkte. –

+0

Viele Bugs sind hier noch vorhanden. Wird sich nicht gut verhalten, wenn mehr als eine Datei mit 'wp-config.php' im Namen übereinstimmt - sollte entweder über die Ergebnisse iteriert werden oder nur die erste genommen werden. Der '* Cache *' wird nicht expandiert, weil er in Anführungszeichen steht. –

+0

@CharlesDuffy - der Anführungszeichen-Fehler wurde von mir zu schnell eingegeben. Der Großbuchstaben-Name ist einfach zu faul für mich zu modifizieren, hätte aber wie in diesem Kommentar erwähnt werden sollen. Ich werde einen schnellen Schnitt machen, solange ich Zeit habe. – alvits