Страницы

Поиск по вопросам

четверг, 11 июля 2019 г.

Python + expect + keepass(kpcli)

Есть на баше скрипт, который создает файл с паролями keepass
#!/bin/bash url="https://10.8.0.1" pass_kp="$USER_KEE_PASS" pass_vpn="$USER_PASS" pass_z="$Z_PASS" pass_tcp="$USER_TCP_PASS" user_none="$USER" #export PATH_KEE=$USER."kdbx" echo $PATH_KEE expect <" send "rmdir Internet
" send "mkdir clickme
" send "cd clickme
" send new
expect Title: send vpn
expect Username: send none
send "$pass_vpn
" send "$pass_vpn
" expect URL: send
send

send new
expect Title: send z
expect Username: send $USER
expect Password: send "$Z_PASS
" expect "Retype to verify:" send "$Z_PASS
" expect URL: send
send

send new
expect Title: send secr_razd
expect Username: send none
expect Password: send "$USER_TCP_PASS
" expect "Retype to verify:" send "$USER_TCP_PASS
" expect URL: send
send

send new
expect Title: send translations
expect Username: send $USER
expect Password: send "$USER:$USER_ICE_PASS
" expect "Retype to verify:" send "$USER:$USER_ICE_PASS
" expect URL: send
send

send "saveas /path/kee/$PATH_KEE
" send "$pass_kp
" send "$pass_kp
" send quit
expect EOF
Который нормально создает файл file.kdbx
Решил перепиать его на Питоне
# -*- coding: utf -*- import os,sys import pexpect
url='https://10.8.0.1' path='/home/firefedot/' pass_kp='cjcfnm' pass_v='cjcfn' pass_z='cjcfnm' pass_tcp='cjcfnm' user="userus1" k=pexpect.spawn('/usr/bin/kpcli') k.sendline("rmdir eMail") k.sendline ('rmdir Internet') k.sendline ('mkdir clickme') k.sendline ('cd clickme') k.sendline ('new') k.expect ('Title:') k.sendline ('v') k.expect ('Username:') k.sendline ('none') k.sendline (pass_v) k.sendline (pass_v) k.expect ('URL:') k.sendline ('
') k.sendline ('
')
k.sendline ('new') k.expect ('Title:') k.sendline ('z') k.expect ('Username:') k.sendline (user) k.expect ('Password:') k.sendline (pass_z) k.expect ('Retype to verify:') k.sendline (pass_z) k.expect ('URL:') k.sendline (url) k.sendline ('
')
k.sendline ('new') k.expect ('Title:') k.sendline ('secr') k.expect ('Username:') k.sendline ('none') k.expect ('Password:') k.sendline (pass_tcp) k.expect ('Retype to verify:') k.sendline (pass_tcp) k.expect ('URL:') k.sendline ('
') k.sendline ('
')
k.sendline ('saveas '+path+user+'.kdbx') k.sendline (pass_kp) k.sendline (pass_kp) k.sendline ('quit') #k.interact()
os.chdir(path) print(os.getcwd()) print (os.system('ls | grep user'))
Скрипт запускается, немного думает и выдает
/home/firefedot - print(os.getcwd()) 256 - print (os.system('ls | grep user'))
То есть файл не создается, но чтото делает. проверил на Fedora 22, CentOS7, питона 2 и 3. одинаковый результат.
Думал, может прав скрипту не хватает, хоть и домашняя директория, но не помогло. Запускаю pdb он проходит по всем строчкам и тоже не показывает ничего.
Получается, что он проделывает все операции, а сохранить не может.
Где и как можно поправить?


Ответ

Вот такой код дождется закрытия kpcli и в итоге cаздаст файл.
# -*- coding: utf -*- import os,sys import pexpect
url='https://10.8.0.1' path='/home/firefedot/' pass_kp='cjcfnm' pass_v='cjcfn' pass_z='cjcfnm' pass_tcp='cjcfnm' user="userus1" k=pexpect.spawn('/usr/bin/kpcli') k.sendline("rmdir eMail") k.sendline ('rmdir Internet') k.sendline ('mkdir clickme') k.sendline ('cd clickme') k.sendline ('new') k.expect ('Title:') k.sendline ('v') k.expect ('Username:') k.sendline ('none') k.sendline (pass_v) k.sendline (pass_v) k.expect ('URL:') k.sendline ('
') k.sendline ('
')
k.sendline ('new') k.expect ('Title:') k.sendline ('z') k.expect ('Username:') k.sendline (user) k.expect ('Password:') k.sendline (pass_z) k.expect ('Retype to verify:') k.sendline (pass_z) k.expect ('URL:') k.sendline (url) k.sendline ('
')
k.sendline ('new') k.expect ('Title:') k.sendline ('secr') k.expect ('Username:') k.sendline ('none') k.expect ('Password:') k.sendline (pass_tcp) k.expect ('Retype to verify:') k.sendline (pass_tcp) k.expect ('URL:') k.sendline ('
') k.sendline ('
')
k.sendline ('saveas '+path+user+'.kdbx') k.sendline (pass_kp) k.sendline (pass_kp) time.sleep(0.6) k.sendline ('quit') k.close() # Вот эта строчка решила проблему
Спасибо за подсказку.

Комментариев нет:

Отправить комментарий