2010-07-27 9 views
31

J'ai un simple script python qui reçoit le nom d'utilisateur et le mot de passe comme argument. Mais mon mot de passe contient deux exclamation marks.When i scénario appelle:Comment passer argument avec point d'exclamation sur Linux?

[email protected]:~/Desktop/$ emailsender.py -u username -p pass!!
commande

que je rentre remplacer plus tôt points d'exclamation

[email protected]:~/Desktop/$emailsender.py -u username -p "passemailsender.py -u username -p passwget wget http://www.crobot.com.hr/templog"

Je peux échapper à des points d'exclamation avec barre oblique inverse (\) mais mes changements de mot de passe. Y at-il une solution pour cela, comment puis-je échapper aux points d'exclamation sans changer le mot de passe?

+0

La deuxième commande ne fait pas beaucoup de sens, qu'est-ce que vous essayez de faire là-bas ?? Spécialement le 'passemailsender.py -u nom d'utilisateur -p passwget wget ...' partie – adamJLev

+2

!! est substitué par le shell, il est remplacé par la dernière commande exécutée. Ce n'est pas spécifique à python. –

+2

@Infinity - Bash interprète "!!" comme la dernière commande que vous avez entrée. Ainsi, quand il entre dans la commande sans échapper son mot de passe en utilisant des guillemets simples ou des barres obliques inverses, bash insère sa dernière commande où le "!!" était. –

Répondre

48

Vous devriez pouvoir envelopper simplement les objets dans des guillemets simples dans le shell.

$ emailsender.py -u username -p 'pass!!' 
-2

Avez-vous essayé

$ emailsender.py -u username -p "pass!!" 

EDIT- Cela ne fonctionnera pas. Lire les commentaires ci-dessous

+0

guillemets n'aidera pas – unbeli

+2

Double/guillemets simples, les deux travailleraient de la même manière dans cet exemple. La différence est que les guillemets simples ne développent pas $ VARIABLES, et les guillemets doubles. http://www.mpi-inf.mpg.de/~uwe/lehre/unixffb/quoting-guide.html – adamJLev

+2

"!!" est une variable dans bash, cependant, des guillemets simples sont requis. –

16

Vous devez échapper avec \ ou citer avec des guillemets simples, sinon votre shell interprète.

emailsender.py -u username -p pass\!\! 

ou

emailsender.py -u username -p 'pass!!' 
+2

juste pour l'enregistrement, échapper fonctionne bien si vous n'êtes pas en train de citer l'argument. Sinon, le '\' sera écrit dans le fichier littéralement. – Bengalaa

2

Comme mentionné par d'autres, cette question n'est pas spécifique à Python, mais est causée par la façon dont vous passez le paramètre de mot de passe au script. Vous devez placer la chaîne de mot de passe entre guillemets simples pour vous assurer qu'elle est passée au script exactement comme vous l'avez saisie et qu'elle n'est pas interprétée par le shell.

Vous pouvez aussi le faire pour le nom d'utilisateur, s'il y a la possibilité qu'il inclue un point d'exclamation ou un autre caractère spécial.

Par exemple:

emailsender.py -u 'username' -p 'pass!!'