Итак, вы готовы попробовать альтернативу клиенту OpenSSH?
Рад за вас. lsh
www.gnu.org/s/lsh/ - это альтернатива GNU, которая может
работать с сервером OpenSSH. К сожалению, это не так просто.
Мы предполагаем, что вы можете ssh
на localhost, на котором запущен OpenSSHD. Ваша первая попытка:
$ lsh localhost
No seed file. Please create one by running
lsh-make-seed -o "/home/tange/.lsh/yarrow-seed-file".
lsh: No randomness generator available.
Итак, давайте сделаем этот файл:
$ mkdir .lsh
$ lsh-make-seed -o "/home/tange/.lsh/yarrow-seed-file"
lsh-make-seed: Reading system state...
lsh-make-seed: Got 150 bits of entropy from system state.
lsh-make-seed: Please type some random data. You better do this
lsh-make-seed: when connected directly to a console, typing over
lsh-make-seed: the network provides worse timing information, and
lsh-make-seed: more opportunities for eavesdropping.
----------------------------------------
........................................
lsh-make-seed: Got 182 keystrokes, estimating 200 bits of entropy.
lsh-make-seed: You can stop typing now.
Теперь мне кажется довольно глупым, что lsh
не использует...
/dev/urandom
и возвращается к набору только на системах, в которых нет
это.
$ lsh localhost
lsh: Failed to open `/home/tange/.lsh/host-acls' for reading (errno = 2): No such file or directory
lsh: Protocol error: Algorithm negotiation failed.
Это происходит из-за того, что lsh
выбирает несовместимый шифр при использовании с последним OpenSSHD. Используйте -c aes256-ctr
- я не знаю, почему он не делает это автоматически:
$ lsh -c aes256-ctr localhost
lsh: Failed to open `/home/tange/.lsh/host-acls' for reading (errno = 2): No such file or directory
lsh: Server's hostkey is not trusted. Disconnecting.
lsh: Protocol error: Bad server host key
Лучше, но недостаточно хорошо. Сделав lsh
менее параноидальным, вы сможете войти:
$ lsh -c aes256-ctr --sloppy-host-authentication localhost
lsh: Failed to open `/home/tange/.lsh/host-acls' for reading (errno = 2): No such file or directory
Received unauthenticated key for host localhost
Key details:
Bubble Babble: xitem-suten-vedyd-hibuv-naril-nisog-luvet-dagik-negem-kykeb-bexyx
Fingerprint: 4b:9f:4b:4d:10:6b:09:2b:be:ee:df:48:a0:75:d3:9a
Do you trust this key? (y/n) y
Last login: Mon Dec 7 08:11:58 2015 from 192.168.1.103
$
Вы можете заставить lsh
добавить этот ключ хоста в доверенные ключи хоста:
$ lsh -c aes256-ctr --sloppy-host-authentication --capture-to ~/.lsh/host-acls localhost
Received unauthenticated key for host localhost
Key details:
Bubble Babble: xitem-suten-vedyd-hibuv-naril-nisog-luvet-dagik-negem-kykeb-bexyx
Fingerprint: 4b:9f:4b:4d:10:6b:09:2b:be:ee:df:48:a0:75:d3:9a
Do you trust this key? (y/n) y
Password for tange:
Last login: Fri Jan 8 12:46:57 2016 from localhost
$
И тогда вы сможете использовать lsh
с обычным парольным входом:
$ lsh -c aes256-ctr localhost
Password for tange:
Last login: Fri Jan 8 12:48:36 2016 from localhost
$
Для авторизации клиентского ключа, преобразуйте ключ в формат OpenSSH и добавьте его в . ssh/authorized_keys
:
$ lsh-keygen | lsh-writekey
xxxxxx
xxxxxx
Enter new passphrase:
Again:
$ lsh-export-key --openssh < ~/.lsh/identity.pub | lsh -c aes256-ctr localhost 'cat >>.ssh/authorized_keys'
Passphrase for key `tange@hk':
Password for tange:
Теперь вы можете использовать ваш ключ lsh
для подключения к серверу OpenSSH. Чтобы избежать ввода паролей, не шифруйте ваш клиентский ключ:
$ lsh-keygen | lsh-writekey -c none
xxxxxx
xxxxxx
$ lsh-export-key --openssh < ~/.lsh/identity.pub | lsh -c aes256-ctr localhost 'cat >>.ssh/authorized_keys'
Password for tange:
$ lsh -c aes256-ctr localhost
Last login: Fri Jan 8 12:48:40 2016 from localhost
$
Да, tsort читает свои входные данные парами, разделенными любым пробелом, включая символы новой строки.
Итак, пример из документации tsort:
tsort <<EOF
a b c
d
e f
b c d e
EOF
Определяет следующие пары порядков:
Собрав все это вместе, вы получите порядок a < b < c < d < e < f, что в данном случае является полным порядком.
Чтение исходного кода подтверждает, что tsort использует readtoken ()из gnulib с набором разделителей, состоящим из пробела, табуляции и новой строки , другими словами, любой пробел.
(Моя первоначальная интерпретация этого примера tsort, чтобы ответить на ваш другой вопрос , заключалась в том, что строка с b c d e
создала три неявные пары, b < c, c < d и d < e, но это на самом деле это не так, все пробелы интерпретируются одинаково, включая новые строки, и за раз читается одна пара.)
tsort
выполняет топологическую сортировку ориентированного графа. Он получает граф в виде пар узлов. Они представляют собой частичное упорядочение графа, а tsort
дает вам полное упорядочение, поскольку в результате (может быть более одного полного упорядочения графа, см. документацию для -f
и -h
. ] опции в системах BSD(недоступны в системах GNU AFAIK )).
Пример реального графа (это пакеты OpenBSD, необходимые для сборки пакета shells/bash
в системе OpenBSD):
$ make -C /usr/ports/shells/bash build-dir-depends
shells/bash devel/ccache
shells/bash devel/gettext
devel/gettext devel/ccache
devel/gettext archivers/xz
archivers/xz devel/ccache
devel/gettext converters/libiconv
converters/libiconv devel/ccache
devel/gettext converters/libiconv
Пара A B
в этом списке означает «A
соединена с B
» (в указанном порядке, поскольку это ориентированный граф ), и в конкретном случае, показанном здесь, это означает "A
зависит от B
"(converters/libiconv
должен быть построен до devel/gettext
, потому что последний зависит от первого ).
tsort
принимает частичный порядок пар узлов и возвращает список узлов в полном порядке, совместимом с этим частичным порядком:
$ make -C /usr/ports/shells/bash build-dir-depends | tsort -r
devel/ccache
archivers/xz
converters/libiconv
devel/gettext
shells/bash
Здесь я поручил tsort
изменить результирующий порядок (невозможно в системах GNU, поскольку -r
не является опцией для GNU tsort
), что дает мне порядок, в котором система должна собрать пакеты, в то же время соблюдая зависимости между ними (, что заканчивается сборкой окончательного shells/bash
пакета ).
Если tsort
получает строку ввода
a b c d
то это то же самое, что и
a b
c d
и как
a b c
d
То есть он всегда считывает узлы графа в парах , независимо от того, разделены ли они пробелами или символами новой строки. Проблема с вашими данными,
a b c
b c d e
заключается в том, что его нельзя прочитать как список пар, так как он содержит нечетное количество узлов.