Поскольку
ssh -o PubkeyAuthentication=no your_host
может быть легко отменен любым, у кого есть доступ к клиенту, чтобы войти в ваш laptob, не требуя вообще пароля, возможно, лучше использовать пароль, зашифрованный частный -key для тех мест назначения, где вы хотите получить пароль до входа в систему.
Вам даже не понадобится использовать csv.reader() для этого. Вот пример (работающий на python 3.6), как это сделать без него, просто используя встроенные функции python и библиотеку sys для синтаксического анализа командной строки. Итак, вот пример один без библиотеки csv, позволяет называть его search_basic.py:
#!/usr/bin/env python3.6
from sys import argv
def parse_files(name_1, name_2):
"""Opens two files and checks if pos #6 in each row of file 1 is present in file2 via simple build-ins"""
try:
with open(file=name_1) as file_1, open(file=name_2) as file_2:
data_1 = file_1.readlines()
data_2 = file_2.readlines()
mapping = {
row.strip('\n').split('|')[-1]: row.strip('\n').split('|')
for row in data_2
}
for row in data_1:
last_column = row.strip('\n').split('|')[-1]
if last_column in mapping:
print(f'{last_column} found in {mapping[last_column]}')
else:
print(f'{last_column} not found, doing other operation')
except FileNotFoundError as error:
print('{}'.format(error))
exit(1)
else:
return
if __name__ == "__main__":
if len(argv) <= 1:
print('No parameters given...')
exit(1)
elif len(argv) == 2:
print('Only one file was given...')
exit(1)
else:
parse_files(argv[1], argv[2])
exit(0)
Но если вы настаиваете на использовании библиотеки csv здесь (пример, работающий на python 3.6), два делают это с csv.reader(), назовем его search_csv.py:
#!/usr/bin/env python3.6
import csv
from sys import argv
def parse_files(name_1, name_2):
"""Opens two files and checks if pos #6 in each row of file 1 is present in file2 via simple build-ins"""
try:
with open(file=name_1) as file_1, open(file=name_2) as file_2:
mapping = {
row[-1]: row
for row in csv.reader(file_2, delimiter='|')
}
for row in csv.reader(file_1, delimiter='|'):
last_column = row[-1]
if last_column in mapping:
print(f'{last_column} found in {mapping[last_column]}')
else:
print(f'{last_column} not found, doing other operation')
except FileNotFoundError as error:
print('{}'.format(error))
exit(1)
else:
return
if __name__ == "__main__":
if len(argv) <= 1:
print('No parameters given...')
exit(1)
elif len(argv) == 2:
print('Only one file was given...')
exit(1)
else:
parse_files(argv[1], argv[2])
exit(0)
Конечно, вам нужно chmod оба файла, чтобы разрешить выполнение:
chmod 755 search_basic.py
chmod 755 search_csv.py
Учитывая ваши предыдущие file1 и file2, оба производят один и тот же вывод с линией ./search_basic.py file1 file2 (или соответствующей ./search_csv.py file1 file2):
25353gb1FAa8 found in ['367536', '163226', '163226', '5007632889', '9', '163226', '2017-11-15 20:37:02.034', '2017-11-28 20:55:24.891', 'STB', '25353gb1FAa8', '25353gb1FAa8']
255411429E02 not found, doing other operation
375g1043DC92 found in ['274451', '24575', '24575', '3872531727', '23', '24575', '2017-11-08 11:43:21.15', '2017-11-25 16:30:21.061', 'STB', '375g1043DC92', '375g1043DC92']
07k9975cad1e not found, doing other operation
Для тех, кто находит этот вопрос и предпочитает решение bash. Следующий скрипт обеспечивает ту же функциональность в меньшем количестве строк.
Хотя вероятнее всего более эффективный с точки зрения вычисления метод. Это был мой быстрый способ захватить вывод grep "$i" "$DRC", не беспокоясь о том, чтобы выполнять любые команды дважды. Если выход grep "$i" "$DRC" не нужен. if grep -q "$i" "$DRC" будет служить тестом.
#!/bin/bash
SRC=/path/to/file1.csv
DRC=/path/to/file2.csv
for i in $(cut -d "|" -f 7 "$SRC")
do
LINE="$(grep "$i" "$DRC")"
if [ $? == 0 ]
then
echo "$i Found in $LINE"
else
echo "$i NOT Found"
fi
done
Вам даже не понадобится использовать csv.reader() для этого. Вот пример (работающий на python 3.6), как это сделать без него, просто используя встроенные функции python и библиотеку sys для синтаксического анализа командной строки. Итак, вот пример один без библиотеки csv, позволяет называть его search_basic.py:
#!/usr/bin/env python3.6
from sys import argv
def parse_files(name_1, name_2):
"""Opens two files and checks if pos #6 in each row of file 1 is present in file2 via simple build-ins"""
try:
with open(file=name_1) as file_1, open(file=name_2) as file_2:
data_1 = file_1.readlines()
data_2 = file_2.readlines()
mapping = {
row.strip('\n').split('|')[-1]: row.strip('\n').split('|')
for row in data_2
}
for row in data_1:
last_column = row.strip('\n').split('|')[-1]
if last_column in mapping:
print(f'{last_column} found in {mapping[last_column]}')
else:
print(f'{last_column} not found, doing other operation')
except FileNotFoundError as error:
print('{}'.format(error))
exit(1)
else:
return
if __name__ == "__main__":
if len(argv) <= 1:
print('No parameters given...')
exit(1)
elif len(argv) == 2:
print('Only one file was given...')
exit(1)
else:
parse_files(argv[1], argv[2])
exit(0)
Но если вы настаиваете на использовании библиотеки csv здесь (пример, работающий на python 3.6), два делают это с csv.reader(), назовем его search_csv.py:
#!/usr/bin/env python3.6
import csv
from sys import argv
def parse_files(name_1, name_2):
"""Opens two files and checks if pos #6 in each row of file 1 is present in file2 via simple build-ins"""
try:
with open(file=name_1) as file_1, open(file=name_2) as file_2:
mapping = {
row[-1]: row
for row in csv.reader(file_2, delimiter='|')
}
for row in csv.reader(file_1, delimiter='|'):
last_column = row[-1]
if last_column in mapping:
print(f'{last_column} found in {mapping[last_column]}')
else:
print(f'{last_column} not found, doing other operation')
except FileNotFoundError as error:
print('{}'.format(error))
exit(1)
else:
return
if __name__ == "__main__":
if len(argv) <= 1:
print('No parameters given...')
exit(1)
elif len(argv) == 2:
print('Only one file was given...')
exit(1)
else:
parse_files(argv[1], argv[2])
exit(0)
Конечно, вам нужно chmod оба файла, чтобы разрешить выполнение:
chmod 755 search_basic.py
chmod 755 search_csv.py
Учитывая ваши предыдущие file1 и file2, оба производят один и тот же вывод с линией ./search_basic.py file1 file2 (или соответствующей ./search_csv.py file1 file2):
25353gb1FAa8 found in ['367536', '163226', '163226', '5007632889', '9', '163226', '2017-11-15 20:37:02.034', '2017-11-28 20:55:24.891', 'STB', '25353gb1FAa8', '25353gb1FAa8']
255411429E02 not found, doing other operation
375g1043DC92 found in ['274451', '24575', '24575', '3872531727', '23', '24575', '2017-11-08 11:43:21.15', '2017-11-25 16:30:21.061', 'STB', '375g1043DC92', '375g1043DC92']
07k9975cad1e not found, doing other operation
Для тех, кто находит этот вопрос и предпочитает решение bash. Следующий скрипт обеспечивает ту же функциональность в меньшем количестве строк.
Хотя вероятнее всего более эффективный с точки зрения вычисления метод. Это был мой быстрый способ захватить вывод grep "$i" "$DRC", не беспокоясь о том, чтобы выполнять любые команды дважды. Если выход grep "$i" "$DRC" не нужен. if grep -q "$i" "$DRC" будет служить тестом.
#!/bin/bash
SRC=/path/to/file1.csv
DRC=/path/to/file2.csv
for i in $(cut -d "|" -f 7 "$SRC")
do
LINE="$(grep "$i" "$DRC")"
if [ $? == 0 ]
then
echo "$i Found in $LINE"
else
echo "$i NOT Found"
fi
done