Поиск ssl генерация ключей. Вы генерируете пару ключей (общедоступный и частный), Вы сохраняете закрытый ключ (ключи), который Вы генерируете в своей системе и помещаете открытые ключи в системы, к которым необходимо получить доступ через ssh. Затем ssh не предлагает Вам пароль, и Вы не должны ожидать.
Вот сценарий, "sskkeygen.sh", я использую для генерации ключей, таким образом, я могу генерировать различные пары ключей для различных систем,
#!/bin/bash
SYSTEM=${1:-boogie}
COMMENT=${2:-"Key for $SYSTEM work"}
ssh-keygen -t dsa -f ~/.ssh/id_dsa.$SYSTEM -C "$COMMENT"
chmod 600 ~/.ssh/id_dsa.$SYSTEM
chmod 600 ~/.ssh/id_dsa.$SYSTEM.pub
Скопируйте ~/.ssh/id_dsa. ключ $SYSTEM.pub к удаленной системе. Будьте Осторожны - инструкции, которые, как все говорят, копируют файл ключей, но Вы хотите добавить его!
Затем Вам нужен файл ~/.ssh/config, который говорит который ключи использовать для который хосты.
#key: prod
Host 1.2.3.4
IdentityFile ~/.ssh/id_dsa.prod
User meself
#key: dev/test
Host 2.3.1.4
IdentityFile ~/.ssh/id_dsa.dev
User meself
#key: ftp dropbox
Host dropbox.company.com
IdentityFile ~/.ssh/id_dsa.dropbox
User virtualuser
#key: ftp thing
Host aaa.bbb.thing.com
IdentityFile ~/.ssh/id_dsa.think
User neato
#key: work
Host *.work.com
IdentityFile ~/.ssh/id_dsa.work
User workid
В bash
while read -r word
do
grep -q "$word" file.before
if [ $? -ne "0" ]
then
echo "$word not in file"
fi
done < <(cut -f1 -d" " file.after)
-q
для grep сообщает ему, чтобы он работал тихо, затем вы можете опросить $?
, чтобы узнать, было ли совпадение 0
или нет 1
.
Используйте perl.
#!/usr/bin/perl
use strict;
use warnings;
my %words_to_find;
open ( my $input, "<", "/tmp/10218.after" );
while ( my $line = <$input> )
{
my ( $word ) = ( $line =~ m/\A(\S+)\s/ );
$words_to_find{$word}++;
}
close ( $input );
open ( my $search, "<", "/tmp/10218.before" );
while ( my $line = <$search> )
{
foreach my $word ( key %words_to_find )
{
if ( $line =~ m/$word/ )
{
print $line;
last;
}
}
}
close ( $search );
Что-то вроде этого должно помочь.
Вы захотите сделать что-нибудь вроде этого:
for i in $(cat /tmp/10218.after)
do
grep $(echo ${i} | cut -f1) /tmp/10218.before
done
Если вы хотите получить немного больше фантазии и вывести что-нибудь, если grep не работает, вы можете сделайте что-нибудь вроде:
for i in $(cat /tmp/10218.after)
do
COUNT=grep -c $(echo ${i} | cut -f1) /tmp/10218.before
if [[ ${COUNT} -eq 0 ]]
then
echo "${i}: Not Found"
else
echo "${i}: Found"
fi
done
Судя по всему, ваш код извлекает первое поле из списка с разделителями табуляцией -в одном файле, а затем пытается найти эти слова во втором файле.
Вы можете несколько упростить это, не сохраняя список слов в массиве:
cut -f1 /tmp/10218.after | grep -f /dev/stdin /tmp/10218.before
Это позволит извлечь слова из первого файла, а затем передать их непосредственно в grep
в качестве шаблонов, которые будут использоваться при сопоставлении со вторым файлом.
Здесь мы можем сделать несколько оптимизаций. Прежде всего, мы можем убедиться, что список слов содержит только уникальных слов:
cut -f1 /tmp/10218.after | sort -u | grep -f /dev/stdin /tmp/10218.before
Во-вторых, мы можем убедиться, что grep
выполняется сравнение строк вместо сопоставления регулярных выражений:
cut -f1 /tmp/10218.after | sort -u | grep -F -f /dev/stdin /tmp/10218.before
Кроме того, мы, возможно, не хотим, чтобы grep
возвращал совпадения для подстрок (, таких как bee
вbumblebee
):
cut -f1 /tmp/10218.after | sort -u | grep -wF -f /dev/stdin /tmp/10218.before
Мы также могли убедиться, что сопоставляем только слова в первом столбце второго файла, переписав слова как привязанные регулярные выражения (и отбросив-F
):
cut -f1 /tmp/10218.after | sort -u | sed 's/^/^/' | grep -w -f /dev/stdin /tmp/10218.before
Команда sed
просто вставляет ^
в начало каждой строки, так что вместо строки bee
мы получаем регулярное выражение ^bee
.
Или мы можем использовать одну awk
программу, которая сделает все за нас:
awk -F '\t' 'FNR == NR { words[$1]++; next } words[$1]' /tmp/10218.after /tmp/10218.before
Это считывает первый столбец с разделителями табуляции -первого файла в массив words
как ключи, а затем проверяет слова во втором файле по этим ключам. Если слово во втором файле встречается в качестве ключа, печатается строка из второго файла.
Если вас не волнует порядок вывода, вы также можете использоватьjoin
:
join <( cut -f1 /tmp/10218.after | sort -u -b ) <( sort -b /tmp/10218.before )
Этот конкретный способ написания команды требует оболочки (, такой как bash
), которая знает о подстановках процессов с помощью <(...)
.
В других оболочках:
cut -f1 /tmp/10218.after | sort -u -b -o keys
sort -b -o data /tmp/10218.before
join keys data