Comment échapper à une chaîne pour une commande shell dans le nœud?
Dans nodejs, la seule façon d'exécuter des commandes externes est par sys.exec(cmd). J'aimerais appeler une commande externe et de lui donner des données via stdin. En nodejs, il ne semble pas encore être une façon de ouvrez une invite de commande puis appuyez données (uniquement pour exec et recevoir ses standard+les sorties d'erreur), donc il semble que la seule façon que j'ai à faire de ce droit est maintenant le biais d'une seule chaîne de commande telle que:
var dangerStr = "bad stuff here";
sys.exec("echo '" + dangerStr + "' | somecommand");
La plupart des réponses à des questions comme celles-ci ont porté sur des regex ne fonctionne pas pour moi en nodejs (qui utilise Google le moteur Javascript V8) ou de fonctionnalités natives à partir d'autres langages comme Python.
Je voudrais échapper à dangerStr de sorte qu'il est sûr de se composer un exec chaîne comme ci-dessus. Si cela peut aider, dangerStr contiendra les données JSON.
- Pour Bourne-type de coquilles que vous pouvez utiliser l'algorithme suivant pour sortir en toute sécurité des chaînes: 1) remplacer toutes les occurrences de l'apostrophe (') avec les quatre séquence de caractères apostrophe, barre oblique inverse, l'apostrophe, l'apostrophe ('\") 2) ajouter une simple citation du début et de la fin de la chaîne modifiée. Attaque et de fuite des apostrophes ne sont pas codés parfaitement efficace, mais il fonctionne encore— "devient" \ "" quand il pourrait être juste \'.
- Pour plus de précision: il m'a fallu un peu de temps pour comprendre @ChrisJohnsen de conseils, mais il vérifie. Si vous voulez
don't do that
sur la coque, neecho 'don'\''t do that'
pour produiredon't do that
.
Vous devez vous connecter pour publier un commentaire.
Il y a une façon d'écrire à une commande externe:
process.createChildProcess
(la documentation) retourne un objet avec unwrite
méthode.createChildProcess
n'est pas aussi pratique, car il n'a pas de tampon de sortie standard stdout et stderr, de sorte que vous aurez besoin de gestionnaires d'événements pour lire la sortie en morceaux.echo
était juste un exemple. L'OP n'est pas juste essayer de diriger une chaîne à une commande. Ils essaient d'utiliser une chaîne de caractères arbitraire à la ligne de commande.C'est ce que j'utilise:
abc\$abc
$
si l'utilisation de l'apostrophe'
foo bar
comme"foo\ bar"
, qui sera analysée commefoo\ bar
.\s
) est inutile si vous encapsuler le tout dans des guillemets doubles comme qui conserve automatiquement tous les espaces. Vous ne devez le faire que s'il n'y avait pas de guillemets autour de la chaîne, autrement, l'espace est vu comme un argument séparateur par le shell. Aussi, vous ne sont pas en citant l'espace correctement lorsque vous tournez un onglet dans\
mais la forme correcte serait\t
.Si vous avez besoin d'une solution simple que vous pouvez utiliser ceci:
De sorte que votre chaîne sera tout simplement échappé avec des guillemets simples comme Chris Brown mentionné.
Il travaille dans
bash
en raison de forte citant, se sent comme il travaille également dansfish
, mais ne fonctionne pas danszsh
etsh
.Si vous avez
bash
votre pouvez exécuter votre script danssh
ouzsh
avec'bash -c \'' + escape('all-the-rest-escaped') + '\''
.Mais en fait... node.js va s'échapper tous les caractères nécessaires pour vous:
ce bloc de code s'exécute:
et de sortie:
ou une erreur.
Prendre un coup d'oeil à http://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options
Par la voie de solution simple à exécuter un tas de commandes est:
Have a nice day!
Vous doit jamais s'appuyer sur la fuite des inconnus entrée d'aller à un shell paramètre - il y aura presque toujours une pointe de cas que vous n'avez pas pensé à cela permet à l'utilisateur d'exécuter du code arbitraire sur votre serveur.
Nœud a un support pour l'appel d'une commande et en passant chaque argument séparément, sans échapper nécessaire. C'est le plus sûr moyen de le faire:
La documentation est ici
Si vous aussi vous devez traiter avec un caractère spécial (sauts de lignes, etc.) vous pouvez le faire de cette façon:
Cela suppose que vous utilisez Bash est fort-citation par des guillemets simples) et le récepteur peut comprendre JSON C comme pour échapper à.