2017-04-15 1 views
1

J'utilise Python 2.7 et Paramiko 2.1.2 pour vérifier si un répertoire Windows existe sur un serveur exécutant OpenSSH. Le répertoire Windows existe sur le serveur, mais mon code ne le trouve pas. De mes tests, il semble que je spécifie incorrectement le répertoire, mais je n'arrive pas à comprendre pourquoi cela ne fonctionne pas. Bien que je ne l'aie pas montré, je ne rencontre pas de succès si j'utilise "/" au lieu de "\". Quelqu'un at-il des idées sur la façon de résoudre le problème, et que se passe-t-il?Utiliser exec_command pour vérifier si un répertoire Windows existe

Mise à jour 1: Cette exécute correctement sur le système Windows,

stdin, stdout, stderr = ssh.exec_command('cmd /c dir "D:\"') 

Cependant, je ne peux toujours pas vérifier l'existence des répertoires spécifiques

Mise à jour 2: Cela semble fonctionner.

stdin, stdout, stderr = ssh.exec_command('if [[ -d /cygdrive/d/log ]]; then echo Exists; fi') 

Cependant, je suis toujours intéressé par les explications à la suivante ne fonctionne pas, ou plutôt ne fonctionne pas toujours.

if_exist_path = "cmd /c if exist \"" + log_path + "\" echo Exists" 
stdin, stdout, stderr = ssh.exec_command(if_exist_path) 

Considérons le code ci-dessous.

import paramiko 
ssh = paramiko.SSHClient() 
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
ssh.connect("10.9.8.7", username="FakeUser", password="FakePassword") 
log_path = "D:\\Log" 
if_exist_path = "cmd /c if exist \"" + log_path + "\" echo Exists" 
print("Var 'if_path_exist' is: {}".format(if_exist_path)) 
stdin, stdout, stderr = ssh.exec_command(if_exist_path) 
stdoutput = stdout.readlines() 
stderror = stderr.readlines() 
print("First Stdout is {}".format(stdoutput)) 
print("First Stderr is {}".format(stderror)) 
print("") 
stdin, stdout, stderr = ssh.exec_command('cmd /c dir "D:\\Log"') 
stdoutput = stdout.read() 
stderror = stderr.read() 
print("Second Stdout is {}".format(stdoutput)) 
print("Second Stderr is {}".format(stderror)) 
print("") 
stdin, stdout, stderr = ssh.exec_command('cmd /c dir "D:\"') 
stdoutput = stdout.read() 
stderror = stderr.read() 
print("Third Stdout is {}".format(stdoutput)) 
print("Third Stderr is {}".format(stderror)) 
print("") 
stdin, stdout, stderr = ssh.exec_command('cmd /c dir "D:\\"') 
stdoutput = stdout.read() 
stderror = stderr.read() 
print("Fourth Stdout is {}".format(stdoutput)) 
print("Fourth Stderr is {}".format(stderror)) 
print("") 
stdin, stdout, stderr = ssh.exec_command('cmd /c dir "D:\Log"') 
stdoutput = stdout.read() 
stderror = stderr.read() 
print("Fifth Stdout is {}".format(stdoutput)) 
print("Fifth Stderr is {}".format(stderror)) 
print("") 
stdin, stdout, stderr = ssh.exec_command('cmd /c dir "D:\Log\"') 
stdoutput = stdout.read() 
stderror = stderr.read() 
print("Sixth Stdout is {}".format(stdoutput)) 
print("Sixth Stderr is {}".format(stderror)) 
print("") 

Sortie:

C:\Scripts>SO_Test.py 
Var 'if_path_exist' is: cmd /c if exist "D:\Log" echo Exists 
First Stdout is [] 
First Stderr is [] 

Second Stdout is Volume in drive D is Apps 
Volume Serial Number is xxxx-xxxx 

Directory of D:\ 


Second Stderr is File Not Found 


Third Stdout is Volume in drive D is Apps 
Volume Serial Number is xxxx-xxxx 

Directory of D:\ 

01/26/2017 10:49 PM <DIR>   Log 
01/12/2017 11:34 AM   12,887 Blah.ps1 
01/12/2017 01:16 PM   12,082 result.txt 
12/12/2016 03:39 PM   23,340 Blahv201.zip 
04/15/2017 10:37 PM <DIR>   Company 
01/27/2017 08:19 PM <DIR>   CompanyBackup 
01/12/2017 01:08 PM   10,060 Untitled1.ps1 
       4 File(s)   58,369 bytes 
       3 Dir(s) 175,276,904,448 bytes free 

Third Stderr is 

Fourth Stdout is 
Fourth Stderr is sh: -c: line 0: unexpected EOF while looking for matching `"' 
sh: -c: line 1: syntax error: unexpected end of file 

Fifth Stdout is Volume in drive D is Apps 
Volume Serial Number is xxxx-xxxx 

Directory of D:\ 


Fifth Stderr is File Not Found 

Sixth Stdout is Volume in drive D is Apps 
Volume Serial Number is xxxx-xxxx 

Directory of D:\ 


Sixth Stderr is File Not Found 
+0

Avez-vous essayé d'exécuter cmd/c dir d: \ à la place? (S'il vous plaît modifier la sortie de cette commande dans votre question.) –

+0

Merci Harry. Je viens de mettre à jour la question. "D: \" fonctionne. Cependant, "D: \ Log \" ne semble pas fonctionner correctement. – Burzin

+0

Cette erreur que vous obtenez à partir du quatrième test est très suspecte, elle implique que 'sh' s'implique d'une manière ou d'une autre et que les backslashes et les citations sont en cours de traitement dans plusieurs couches. Essayez le même ensemble de tests, mais ajoutez 'echo' après chaque'/c', par exemple, 'cmd/c echo dir '' D: \ Log '', j'espère que vous serez capable de voir à quoi ressemble la commande une fois il a traversé tout le filtrage. –

Répondre

-2

Vous cherchez os.path.isdir, ou os.path.exists pour le répertoire.

if os.path.isdir("/test/to/dir") == True: 

    print('dir exists ') 

    # you next actions 
+0

ne pas oublier d'importer os –

+1

Le code OP teste l'existence d'un répertoire sur une machine distante (via SSH) mais cette réponse ne concerne que le test de l'existence d'un répertoire sur la machine locale. –

+0

@ Mahdi_Bahri A moins que je ne manque quelque chose, je ne pense pas que ce soit ça. J'essaie de vérifier l'existence d'un répertoire sur un système Windows distant. Le système distant n'a pas de Python dessus. Le système local, d'où je cours le script, a Python, mais cela ne m'aide pas. – Burzin