2010-11-05 2 views
1

Je me demande quels sont tous les caractères nécessaires pour échapper un chemin Linux. Par exemple, path/home/user1/Ma musique/chanson 1.mp3 doit être échappée dans un shell pour la commande ls/home/user1/My \ Music/song \ 1.mp3 '.Quels sont tous les caractères de chemin d'accès linux possibles qui doivent s'échapper

Je veux écrire une fonction qui accepte une chaîne comme chemin et échappe tous les caractères nécessaires. En scala je:

def normalizePath(path: String): String = { 
var normPath = path.replaceAll(" ", "\\\\ ") 
normPath = normPath.replaceAll("\\]", "\\\\]") 
normPath = normPath.replaceAll("\\[", "\\\\[") 

normPath 

}

Sachant qu'il ya plus d'ombles qui ont besoin d'échapper. Aussi, cela pourrait être fait par une commande (regex plus complexe)?

+0

oui Normaliser 'chaîne (string s) {return "\" "+ s +" \ ""; } ' – Novikov

+1

Pourquoi ne pas simplement utiliser un shell pour cela en premier lieu? –

+1

La réponse dépend de l'endroit où vous prévoyez d'utiliser le chemin. Par exemple, si elle doit être transmise au shell, alors vous devez échapper les caractères spéciaux interprétés par le shell (qui peuvent inclure '!', '*', '?', Etc., et peut-être dépend de quel shell est utilisé).Si vous placez le chemin dans une URL, vous devez échapper à un ensemble de caractères différent et utiliser un mécanisme différent pour l'échappement (% -encode). Et si vous utilisez le chemin directement avec un appel système Linux, vous n'avez pas besoin d'échapper à quoi que ce soit. –

Répondre

7

Vous ne devriez pas relayer à ce sujet. Il existe de nombreux moyens de contourner ce problème (par exemple, en définissant la variable d'environnement FS). Utilisez simplement la classe ProcessBuilder pour passer l'argument de la ligne de commande.

ProcessBuilder proc = new ProcessBuilder("ls", "/home/user1/My Music/song 1.mp3"); 
proc.start(); 
+0

Le monde de la différence! Merci! – NullPointer0x00

2

Il est plus simple de citer des chaînes que de leur échapper, je pense. L'algorithme de guillemet simple est:

  • ajouter un guillemet simple char ouvrir
  • pour chaque caractère dans la chaîne d'origine,
    • si elle est une seule citation, ajoutez guillemet simple, barre oblique inverse, simple citation, simple (fermez la citation, ajoutez guillemet simple échappé, rouvrir citation)
    • autrement append le charbon lui-même
  • append char guillemet simple pour fermer

Donc c'est assez facile. Cependant, j'aime la réponse de ProcessBuilder, qui est encore plus facile si cela fonctionne pour vous. Éviter complètement le shell est à la fois un gain de performance et de sécurité, si vous n'avez pas besoin de fonctionnalités shell et que vous voulez juste générer un processus.

Si vous voulez utiliser l'échappement, je suggère de mettre en liste blanche au lieu de mettre en liste noire les caractères. c'est-à-dire échapper à tout ce qui n'est pas [a-zA-Z0-9_] ou quelque chose. N'importe quel caractère peut être échappé sauf newline. backslash suivi d'un retour à la ligne signifie "supprimer à la fois le backslash et le retour à la ligne" - si en dehors des guillemets. A l'intérieur de guillemets doubles, je pense que vous pouvez échapper newline avec backslash puis newline. À l'intérieur des guillemets simples, je ne pense pas que vous deviez (ou pouvez) échapper newline, juste ajouter le caractère de nouvelle ligne.

Une bonne référence est la spécification UNIX98 pour "Commande Shell Langue" http://www.opengroup.org/onlinepubs/009695399/utilities/xcu_chap02.html

0

guillemets simples empêchent l'extension shell, donc tout ce dont vous avez besoin est:

def normalizePath(path: String): String = "'" + path.replace("'", "\\'") + "'" 
Questions connexes