Я удалил свой открытый ключ из каталога ~/.ssh, почему я все еще могу получить доступ к хосту без пароля?

#реферат

Печатать строки без новой строки, добавлять новую строку, только если есть еще одна строка для печати.

$ printf 'one\ntwo\n' | 

     awk '{ printf( "%s%s", NR>1?"\n":"", $0 ) }';   echo " done"

one
two done

#Другие решения Если бы мы работали с файлом, мы могли бы просто обрезать из него один символ (, если он заканчивается на новой строке):

removeTrailNewline(){ [[ $(tail -c 1 "$1") ]] || truncate -s-1 "$1"; }

Это быстрое решение, так как нужно прочитать только один символ из файла, а затем удалить его напрямую(truncate)без чтения всего файла.

Однако при работе с данными из стандартного ввода (потока )данные должны быть прочитаны целиком. И он «потребляется», как только он прочитан. Без возврата (, как с усечением ). Чтобы найти конец потока, нам нужно прочитать до конца потока. В этот момент нет возможности вернуться к входному потоку, данные уже «израсходованы». Это означает, что данные должны храниться в некотором буфере до тех пор, пока мы не совпадем с концом потока, а затем что-то сделать с данными в буфере.

Наиболее очевидным решением является преобразование потока в файл и обработка этого файла. Но вопрос требует какого-то фильтра потока. Не об использовании дополнительных файлов.

###переменная Наивным решением было бы записать весь ввод в переменную :

.
FilterOne(){ filecontents=$(cat; echo "x");        # capture the whole input
             filecontents=${filecontents%x};       # Remove the "x" added above.
             nl=$'\n';                             # use a variable for newline.
             printf '%s' "${filecontents%"$nl"}";  # Remove newline (if it exists).
       }

printf 'one\ntwo'     | FilterOne ; echo 1done
printf 'one\ntwo\n'   | FilterOne ; echo 2done
printf 'one\ntwo\n\n' | FilterOne ; echo 3done

###память С помощью sed можно загрузить в память целый файл. В sed невозможно избежать завершающей новой строки в последней строке. GNU sed может не печатать завершающую новую строку, но только если в исходном файле она уже отсутствует. Так что нет, простой sed не может помочь.

За исключением GNU awk с опцией -z:

sed -z 's/\(.*\)\n$/\1/'

С помощью awk (любой awk ), slurp весь поток, и printfбез завершающей новой строки.

awk '    { content = content $0 RS } 
     END { gsub( "\n$", "", content ); printf( "%s", content ) }
    '

Загрузка всего файла в память может быть плохой идеей, так как это может занять много памяти.

###Две строчки в памяти В awk мы можем обрабатывать две строки за цикл, сохраняя предыдущую строку в переменной и выводя текущую :

.
awk 'NR>1{print previous} {previous=$0} END {printf("%s",$0)}'

###Прямая обработка Но мы могли бы сделать лучше.

Если мы печатаем текущую строку без новой строки и печатаем новую строку только тогда, когда существует следующая строка, мы обрабатываем одну строку за раз, и последняя строка не будет не иметь завершающую новую строку:

awk 'NR==1{ printf ("%s",$0 );далее }; { printf ("\n%s", $0 )}'

Или как-нибудь иначе:

awk 'NR>1{ print "" }; { printf( "%s", $0 ) }'

Или:

awk '{ printf( "%s%s", NR>1?"\n":"", $0 ) }'

Так:

$ printf 'one\ntwo\n' | awk '{ printf( "%s%s", NR>1?"\n":"", $0 ) }'; echo " done"
one
two done
0
11.11.2020, 04:17
2 ответа

При криптографии с открытым ключом вы выдаете открытый ключ, а закрытый ключ оставляете себе.. закрытым. Когда что-то хочет отправить вам что-то, они используют открытый ключ для шифрования этого, а вы используете закрытый ключ для его расшифровки. После того, как вы выдали открытый ключ, он вам не нужен для расшифровки сообщений.

Я не знаю подробностей того, как ssh использует эти ключи, но при использовании опции -vя вижу:

$ ssh -vvv vm
...
debug1: identity file /Users/username/.ssh/id_rsa type 0
...
debug1: Offering public key: /Users/username/.ssh/id_rsa RSA SHA256:...
debug3: send packet: type 50
debug2: we sent a publickey packet, wait for reply
debug3: receive packet: type 60
debug1: Server accepts key: /Users/username/.ssh/id_rsa RSA SHA256:/...

Учитывая это, я предполагаю, что он использует закрытый ключ для получения открытого ключа, а затем отправляет открытый ключ на удаленный хост.

Если вы хотите сделать так, чтобы эта конфигурация больше не работала, вам нужно [пере]переместить закрытый ключ( ~/.ssh/id_rsa).

1
18.03.2021, 22:50

Вы сказали, что у удаленного все еще есть открытый ключ (в~/.ssh/authorized_keys). И у локального все еще есть закрытый ключ (~/.ssh/id_rsa).

Вот как.


И да (чтобы прокомментировать другой ответ )протокол просто пробует все доступные ключи, пока не попадет.

А отправка хэшей — это просто способ быстрее найти ключ. Удаленный хеширует все свои открытые ключи, сравнивает хэши и использует совпадающий ключ. Открытый ключ можно получить из файла закрытого ключа ().

debug1: Offering public key: /Users/username/.ssh/id_rsa RSA SHA256предполагает, что клиент получает хэш открытого ключа из файла закрытого ключа. Таким образом, открытый ключ -находится внутри, или можно получить открытый ключ -из закрытого ключа -(в зависимости от типа ключа ).

1
18.03.2021, 22:50

Теги

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