Domanda

Vorrei eseguire uno script di shell, da un file o da una stringa object-c (all'interno del codice). Vorrei anche che il risultato dello script della shell fosse archiviato in una variabile. Non vorrei che lo script della shell fosse diviso in argomenti (come setLaunchPath quando lo eseguo). Ad esempio: eseguendo questo script di shell " mount_webdav idisk.mac.com/mac_username / Volumes / mac_username " invece di " / bin / mount_webdav " quindi gli argomenti. C'è un modo per fare questo? Sto usando NSTask in questo momento, ma mi ha causato alcuni errori quando provo a mettere gli argomenti con esso. Ecco il codice proposto:

(alcuni dei file .m)

 NSString *doshellscript(NSString *cmd_launch_path, NSString *first_cmd_pt) {

 NSTask *task = [[NSTask alloc] init]; // Make a new task

 [task setLaunchPath: cmd_launch_path]; // Tell which command we are running

 [task setArguments: [NSArray arrayWithObjects: first_cmd_pt, nil]];

 [task setArguments: first_cmd_pt];

 NSPipe *pipe = [NSPipe pipe];

 [task setStandardOutput: pipe];

 [task launch];

  NSData *data = [[pipe fileHandleForReading] readDataToEndOfFile];

  NSString *string = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];

  [task release]; //Release the task into the world, thus destroying it.

  return string;
}


NSString *mount_idisk(NSString *mac_username) {

 doshellscript(@"/bin/mkdir", [@"/Volumes/" stringByAppendingString:mac_username]);

 NSString *path_tmp = [mac_username stringByAppendingString: @"/ /Volumes/"];

 NSString *idisk_path = [path_tmp stringByAppendingString:mac_username];

 //NSLog(@"%@", [@" http://idisk.mac.com/" stringByAppendingString: idisk_path]);

 NSString *finished_path = [@"http://idisk.mac.com/" stringByAppendingString: idisk_path];

 doshellscript(@"/sbin/mount_webdav", finished_path);
}

... Ecco la linea che sto usando per eseguirlo: mount_idisk (" nome utente ");

È stato utile?

Soluzione

Non c'è modo di passare un'intera riga di comando a NSTask.

Per una buona ragione; farlo è pieno di buchi di sicurezza se hai qualsiasi tipo di composizione di stringhe in corso. Il codice di composizione della stringa dovrebbe essere pienamente a conoscenza di tutte le regole di analisi di una riga di comando della shell e dovrebbe sfuggire a ogni possibile combinazione di caratteri che potrebbe portare all'esecuzione arbitraria di comandi.

L'API C system () ti consente di eseguire comandi arbitrari, ma non ha alcun meccanismo per acquisire direttamente l'output. Sarebbe facile aggiungere qualcosa alla tua riga di comando che sparga l'output in un file temporaneo che in seguito leggi, ma in questo modo aggiungi solo più falle di sicurezza sopra e oltre il passaggio di un'intera riga di comando come una singola stringa.

Aspetta ... Sembra che tu abbia un bug semplice:

[task setArguments: [NSArray arrayWithObjects: first_cmd_pt, nil]];
[task setArguments: first_cmd_pt];

Perché stai impostando e quindi reimpostando gli argomenti dell'attività?

Dato che la tua funzione mount_idisk () sta componendo efficacemente i singoli argomenti e li sta concatenando insieme in una singola stringa, perché non semplicemente inserisci tutti gli argomenti in un NSArray e modifica doshellscript () per prendere un array come secondo parametro; la matrice di argomenti?


Non stai creando correttamente la matrice di argomenti.

Vale a dire:

NSArray *finished_path = [NSArray arrayWithObjects:@"http://idisk.mac.com/", mac_username, @"/ /Volumes/", mac_username, nil];

Quella linea che sta creando un array contiene 4 oggetti che vengono quindi trattati come 4 argomenti separati nella funzione doshellscript () e non i due argomenti necessari.

Forse qualcosa del tipo:

NSString *mobileMeUserURL = [@"http://idisk.mac.com/" stringByAppendingString: mac_username];
NSString *localMountPath = [ @"/ /Volumes/" stringByAppendingString:  mac_username];
NSArray *arguments = [NSArray arrayWithObjects: mobileMeUserURL, localMountPath, nil];
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top