5

Ho uno script di distribuzione a cui devo passare la password LDAP come parametro cmd.Come devo passare la password (contenente caratteri speciali) come argomento della riga di comando?

password effettiva:  foo\$ser"ver\\ 1  (contiene tre caratteri di spazio: all'inizio, prima di 1, e dopo 1)

esempio

...bin>deployment.bat LDAPPassword= foo\$ser\"ver\\ 1 

Nota: Non ci sono spazi nella password come mostrato all'inizio .

Il deployment.bat chiama una classe a cui il parametro precedente viene passato come argomento. Il problema è che la classe riceve 2 argomenti distinti:

args[0]= foo\$ser"ver\\   //The space after \\ is omitted 
args[1]=1       //The space before and after 1 is omitted 

Come faccio a passare questa password in modo che sia ricevuto come singola stringa?

ho già provato citando la password come

...bin>deployment.bat LDAPPassword=" foo\$ser"ver\\ 1 " 

tuttavia non funzionerà.

+1

si prega di fornire il codice per avere maggiori informazioni –

+0

provare invece '% *' – Alex

+0

forse si potrebbe elaborare su quello che sta succedendo all'interno 'deployment.bat' , in particolare come l'argomento viene elaborato e passato alla classe che stai citando. Inoltre, ho modificato il tuo post per provare a rendere più chiaro il tuo problema, ti invitiamo a controllare e a sentirti libero di modificare/eseguire il rollback, se necessario. –

risposta

2

Non è possibile sfuggire la password in alcun modo.
Poiché alcune combinazioni con virgolette e spazi non possono essere inserite in un parametro.

In questo modo " (<space><quote><space>) anche se si aggiungono alcune virgolette in giro, non è possibile, anche se si citano gli spazi e le virgolette stesse.

myBat " 
myBat " " " 
myBat^" 
myBat ^"^ ^"^ ^" 

Ecco il modo migliore per raddoppiare tutte le virgolette all'interno della password e racchiudere la password tra virgolette.
Quindi è possibile utilizzare tutti gli altri caratteri senza problemi.

deployment.bat "foo \ $ ser \" "ver \ 1"

E in deployment.bat

@echo off 
setlocal DisableDelayedExpansion 
set "pwd=%~1" 
setlocal EnableDelayedExpansion 
set "pwd=!pwd:""="!" 
echo pwd='!pwd!' 

Si consiglia di utilizzare la password solo con l'espansione ritardata per evitare problemi con characterts speciali .

Per accedere riga di comando parametri che si potrebbe anche guardare
SO: How to receive even the strangest command line parameters?

2
" foo\$ser\"ver\ 1 " 

citare la stringa completa è necessario sfuggire alla citazione in modo che non è visto come un preventivo finale.

E nei casi in cui la citazione è già preceduta da una barra rovesciata, sarà inoltre necessario evitare la barra rovesciata. Così una password come

this isa\"test 

dovrebbe essere scritto come

"thisisa\\\"test" 

Per ulteriori informazioni, this è il modo "solito" di argomenti di analisi in Windows.

MODIFICATO - Solo per documentare i test. L'utilizzo di questo file batch (test.cmd)

@echo off 
    cls 
    echo(-------------------------------------------- 
    echo [%1][%2][%3][%4][%5][%6][%7][%8][%9] 
    echo(-------------------------------------------- 
    cmdline.exe %1 %2 %3 %4 %5 %6 %7 %8 %9 
    echo(-------------------------------------------- 
    cmdline.exe %* 
    echo(-------------------------------------------- 
    java CmdLine %1 %2 %3 %4 %5 %6 %7 %8 %9 
    echo(-------------------------------------------- 
    java CmdLine %* 
    echo(-------------------------------------------- 

dove cmdline.exe si ottiene da questo codice c

#include "windows.h" 
#include "stdio.h" 

void main(int argc, char **argv){ 
    int i; 
    printf("cmdline:[%s]\r\n\r\n",GetCommandLine()); 
    for(i = 0; i < argc ; i++) printf("arg_%03d:[%s]\r\n",i,argv[i]); 
}; 

e CmdLine.java è

public class CmdLine { 
    public static void main (String[] args) { 
     int i = 0; 
     for (String s: args) { 
      System.out.println(String.format("arg_%03d:[%s]",++i,s)); 
     } 
    } 
} 

Esecuzione test.cmd " foo\$ser\"ver\ 1 " i risultati sono

-------------------------------------------- 
[" foo\$ser\"ver\][1]["][][][][][][] 
-------------------------------------------- 
cmdline:[cmdline.exe " foo\$ser\"ver\ 1 "  ] 

arg_000:[cmdline.exe] 
arg_001:[ foo\$ser"ver\ 1 ] 
-------------------------------------------- 
cmdline:[cmdline.exe " foo\$ser\"ver\ 1 "] 

arg_000:[cmdline.exe] 
arg_001:[ foo\$ser"ver\ 1 ] 
-------------------------------------------- 
arg_001:[ foo\$ser"ver\ 1 ] 
-------------------------------------------- 
arg_001:[ foo\$ser"ver\ 1 ] 
-------------------------------------------- 
+0

'... questo è il" solito "modo di analizzare gli argomenti in windows' ma non per i file batch. Il backslash non necessita di escape – jeb

+1

@jeb, non in batch. Ma il problema è ottenere la password indicata all'interno del programma finale (la classe viene chiamata, come indica OP) passandola come parametro a un file batch. Non importa ciò che vede il file batch, la domanda è ciò che è necessario per trasportare un valore della riga di comando in questa classe e che la classe veda il valore corretto. Ed è l'argomento parser del programma che richiede la diversa fuga di caratteri. –

+0

Ok, hai ragione, ho ridotto il problema a trasferire solo la password al file batch non al programma finale – jeb