Обратите внимание, что split
не работает, как вы думаете. Он разбивается не на слово, а на любой символ, указанный во второй строке. Например, split «xax» «abc»
действительно разделит xax
на 2 части, несмотря на то, что он не содержит последовательности abc
.
Простой способ разбить строку по заданной подстроке - это, например, использовать команду сначала строка
, чтобы найти начало подстроки, затем диапазон строк
для копирования вверх до этого момента:
set str $expect_out(buffer)
set v [string range $str 0 [string first "\[root@" $str]-1]
Затем вы можете проверить v
на пустоту или нет.
В качестве альтернативы, вместо выполнения expect "~] #"
, почему бы не ожидать "\ [root @"
, тогда $ expect_out (buffer)
будет уже содержат то, что вы хотели извлечь.
Для более ранних версий tcl / expect может потребоваться использовать expr
для вычитания 1 из индекса вместо того, чтобы разрешать диапазон строк
принимать форму номер-номер. Так что используйте, например:
set v [string range $str 0 [expr [string first "\[root@" $str] - 1]]
Судя по вашему описанию, вы хотите убрать опции и строки комментариев. Согласно man 8 sshd
:
Открытые ключи состоят из следующих разделенных пробелами полей: параметры, тип ключа, ключ в кодировке base64, комментарий. Поле параметров необязательно. Тип ключа - «ecdsa-sha2-nistp256», «ecdsa-sha2-nistp384», «ecdsa-sha2-nistp521», «ssh-ed25519», «ssh-dss» или «ssh-rsa»; поле комментария ни для чего не используется (но может быть удобным для пользователя для определения ключа).
Следовательно, вы можете сделать что-то вроде этого:
sed '
/^[ ]*$/d;
/^#/d;
s/^.* \(ecdsa-sha2-nistp256\|ecdsa-sha2-nistp384\|ecdsa-sha2-nistp521\|ssh-ed25519\|ssh-dss\|ssh-rsa\) /\1 /' \
~/.ssh/authorized_keys
Предполагается, что ключевые комментарии не содержат ssh-dss
, ssh-rsa
и т. Д. Также предполагается ] sed (1)
, поддерживающая ИЛИ
(т.е. \ |
).
Использование текстового редактора может оказаться проще и безопаснее. :)