Escape un personaggio stella (*) in bash

Non posso farlo. Se * è in una variabile, si espande ad un elenco di file nella cartella corrente. echo "*" funziona bene.

#!/bin/bash c="GRANT ALL ON \*.* TO '$1'@'localhost';" mysql < $c exit 0; 

  • Determinare se il sistema operativo Linux sta avviando un USB
  • Linux acls usa il gID sbagliato per i gruppi di dominio, ma gids numbersci sono ok
  • Qual è il modo più semplice per eseguire il backup di istanze EC2 automaticamente?
  • Perché è cattivo avere file di root di scrittura in una directory non di properties; di root?
  • PHP è rotto dopo l'aggiornamento a php 5.4
  • Imposta il collegamento simbolico in cui gli utenti possono accedervi con FTP
  • 7 Solutions collect form web for “Escape un personaggio stella (*) in bash”

    Utilizza singole citazioni per la tua string:

     c='GRANT ALL ON *.* TO'; c="${c} '$1'@'localhost';"; 

    Probabilmente c'è un modo migliore per farlo, ma includendo $ 1 nella string ha reso strano

    1. Mettere sempre doppie virgolette intorno alle sostituzioni variables, altrimenti i caratteri come spazi e * appaiono nel valore vengono interpretati dalla shell. Ad esempio, scrivere "$c" , non $c .

    2. La syntax mysql <"$c" rende i comandi di esecuzione di mysql da un file il cui nome è il valore di $c . Quello che stai cercando è

       printf '%s\n' "$c" | mysql 

      o più semplici, fintanto che ti ricordi le restrizioni ( $c non deve iniziare con una - , e se contiene \ che è ok in bash ma non in altre varianti di sh)

       echo "$c" | mysql 

      C'è un'altra alternativa più comoda se il command è multilinea. Si chiama "documento qui". La string EOF non è speciale (anche se è tradizionale), each sequenza di lettere e cifre farà. L' EOF terminante non può essere preceduto da spazi vuoti. È necessario mettere un \ prima di each $ , \ e ` less che non si desideri che siano interpretati dalla shell.

       mysql <<EOF GRANT ALL ON *.* TO '$1'@'localhost'; EOF 
    3. Attenzione che se l'argomento alla shell contiene una singola citazione, hai un vector di iniezione. Il seguente snippet aggiunge una \ prima di each \ e ' .

       set -- "${1//\\/\\\\}" set -- "${1//\'/\'}" 

      Questo è abbastanza brutto, per questo se si intende fare qualcosa di complicato, dimentica di utilizzare una shell e di utilizzare una lingua con attacchi SQL effettivi (perl, python, qualsiasi cosa) where la libreria gestisce tutta la citazione e la procedura di costruzione per voi .

    Questo functionrà in bash, senza fuggire necessari

     #!/bin/bash mysql -u root -e "GRANT ALL ON *.* TO '$1'@'localhost'" exit 0; 

    Innanzitutto è necessario printingre il command SQL utilizzando echo.

    Quindi wherete mettere le virgolette intorno a $c come così:

     mysql <( echo "$c" ) 

    Altrimenti il ​​valore di $c verrà trattato come un command bash e quindi il * verrà espanduto.

    O una versione più semplice potrebbe essere:

     mysql -e "$c" 

    Non è più complicato di questo:

     #!/bin/bash c="GRANT ALL ON *.* TO $1@localhost;" mysql -e "$c" 

    Oppure, se avete bisogno delle singole citazioni:

     #!/bin/bash c="GRANT ALL ON *.* TO '$1'@'localhost';" mysql -e "$c" 

    Semplice è perfetto! (citare la prima parte con citazione singola)

     #!/bin/bash c='GRANT ALL ON *.*' "TO '$1'@'localhost';" mysql < $c exit 0; 

    dovrebbe anche essere perfetto! ($ c citato)

     #!/bin/bash c="GRANT ALL ON *.* TO '$1'@'localhost';" mysql < "$c" exit 0; 

    La caratteristica che combatti è shell globbing come parte dell'espansione del path. Distriggers questa operazione per risolvere il problema principale riportto. Quindi utilizzare il suggerimento di Weboide di -e per eseguire un singolo command contenuto nella variabile $ c attraverso MySQL. Saluti,

     [maxwell@elite ~]$ cat me.sh #!/bin/bash # disable shell globbing so c variable can be literal set -f c="GRANT ALL ON *.* TO '$1'@'localhost';" echo $c # enable shell globbing for normal operation set +f echo $c [maxwell@elite ~]$ ./me.sh maxwell GRANT ALL ON *.* TO 'maxwell'@'localhost'; GRANT ALL ON labserver.etc.0710.tar me.sh Validation.txt TO 'maxwell'@'localhost'; [maxwell@elite ~]$ 
    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.