как передать вывод по каналу сокращения к команде foreach?

Поиск 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

2
04.02.2019, 14:49
4 ответа

В 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 .

4
27.01.2020, 21:51

Используйте 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 );

Что-то вроде этого должно помочь.

1
27.01.2020, 21:51

Вы захотите сделать что-нибудь вроде этого:

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
3
27.01.2020, 21:51

Судя по всему, ваш код извлекает первое поле из списка с разделителями табуляцией -в одном файле, а затем пытается найти эти слова во втором файле.

Вы можете несколько упростить это, не сохраняя список слов в массиве:

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
0
27.01.2020, 21:51

Теги

Похожие вопросы