Регулярное выражение для соответствия строке соединения ssh

Я тщетно пытаюсь написать регулярное выражение, чтобы соответствовать действительные строки подключения SSH.

Мне действительно нужно распознавать только строки формата:

  • пользователь @ хост: / некоторые / путь

но было бы неплохо также сопоставить неявный домашний каталог:

  • пользователь @ имя хоста:

Я до сих пор придумал это регулярное выражение:

/^[:alnum:]+\@\:(\/[:alnum:]+)*$/

который не работает как задумано.

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

10.12.2008 11:14:31
7 ОТВЕТОВ

Выражения в скобках идут внутри своих скобок. Вы соответствуете любому из двоеточия, 'a', 'l', 'm', 'n' или 'u'.

И как сказал Пакс, вы пропустили имя хоста. Но выражения в скобках все еще неверны.

0
10.12.2008 11:24:38

У вашего поставленного регулярного выражения нет секции имени хоста. Пытаться:

/^[:alnum:]+\@[:alnum:\.]\:(\/[:alnum:]+)*$/

или

/^[A-Za-z][A-Za-z0-9_]*\@[A-Za-z][A-Za-z0-9_\.]*\:(\/[A-Za-z][A-Za-z0-9_]*)*$/

так как я не доверяю alnum без двойных скобок.

Кроме того,: alnum: может не дать вам необходимый диапазон для ваших разделов. Вы можете иметь "." символы в имени вашего хоста, а также могут потребоваться символы "_". И редко я видел имена пользователей или хостов, начинающиеся не с алфавита.

Так же , как примечание стороны, я стараюсь избегать расширенных регулярных выражений , так как они не работают на всех регулярных выражений двигателей (я использую UNIX на долгое время). К сожалению, это делает мои регулярные выражения неловкими (см. Выше) и не слишком интернационализируемыми. Извиняюсь за это.

2
10.12.2008 11:43:31

Что делает СГМ, вы делаете

/^[:alnum:]+\@\:(\/[:alnum:]+)*$/

Где вы должны делать

/^[[:alnum:]]+\@\:(\/[[:alnum:]]+)*$/

Ответ Пакса также практичен, но не будет работать без правильного двойного брекетинга.

my $at  = q{@};
my @res = (
    qr/^[:alnum:]+${at}[:alnum:]+:(\/[:alnum:]+)*$/,
    qr/^[[:alnum:]]+${at}[[:alnum:]]+:(\/[[:alnum:]]+)*$/,
    qr/^[a-z][[:alnum:]_]*${at}[a-z][[:alnum:]_.]*:(\/[^\/]*)*$/i,
);

my @u = qw{
  user@hostname:/some/path
  bob_foo@bobs.fish.stores.com:/foo/bar/baz/quux_
  9foo@9foo.org:/9foo/9foo
  baz@foo.org:/9foo/_#_numerics_are_fine_in_URI_and_so_is_anything_else_(virtually)
};

for my $str (@u) {
    for my $re (@res) {
        if ( $str =~ $re ) {
            print "$str =~ $re\n";
        }
        else {
            print "NOT $str =~ $re\n";
        }
    }
}

POSIX syntax [: :] belongs inside character classes in regex; marked by <-- HERE in m/^[:alnum:] <-- HERE +@[:alnum:]+:(/[:alnum:]+)*$/ at /tmp/egl.pl line 27.
POSIX syntax [: :] belongs inside character classes in regex; marked by <-- HERE in m/^[:alnum:]+@[:alnum:] <-- HERE +:(/[:alnum:]+)*$/ at /tmp/egl.pl line 27.
POSIX syntax [: :] belongs inside character classes in regex; marked by <-- HERE in m/^[:alnum:]+@[:alnum:]+:(/[:alnum:] <-- HERE +)*$/ at /tmp/egl.pl line 27.
NOT user@hostname:/some/path =~ (?-xism:^[:alnum:]+@[:alnum:]+:(/[:alnum:]+)*$)
user@hostname:/some/path =~ (?-xism:^[[:alnum:]]+@[[:alnum:]]+:(/[[:alnum:]]+)*$)
user@hostname:/some/path =~ (?i-xsm:^[a-z][[:alnum:]_]*@[a-z][[:alnum:]_.]*:(/[^/]*)*$)
NOT bob_foo@bobs.fish.stores.com:/foo/bar/baz/quux_ =~ (?-xism:^[:alnum:]+@[:alnum:]+:(/[:alnum:]+)*$)
NOT bob_foo@bobs.fish.stores.com:/foo/bar/baz/quux_ =~ (?-xism:^[[:alnum:]]+@[[:alnum:]]+:(/[[:alnum:]]+)*$)
bob_foo@bobs.fish.stores.com:/foo/bar/baz/quux_ =~ (?i-xsm:^[a-z][[:alnum:]_]*@[a-z][[:alnum:]_.]*:(/[^/]*)*$)
NOT 9foo@9foo.org:/9foo/9foo =~ (?-xism:^[:alnum:]+@[:alnum:]+:(/[:alnum:]+)*$)
NOT 9foo@9foo.org:/9foo/9foo =~ (?-xism:^[[:alnum:]]+@[[:alnum:]]+:(/[[:alnum:]]+)*$)
NOT 9foo@9foo.org:/9foo/9foo =~ (?i-xsm:^[a-z][[:alnum:]_]*@[a-z][[:alnum:]_.]*:(/[^/]*)*$)
NOT baz@foo.org:/9foo/_#_numerics_are_fine_in_URI_and_so_is_anything_else_(virtually) =~ (?-xism:^[:alnum:]+@[:alnum:]+:(/[:alnum:]+)*$)
NOT baz@foo.org:/9foo/_#_numerics_are_fine_in_URI_and_so_is_anything_else_(virtually) =~ (?-xism:^[[:alnum:]]+@[[:alnum:]]+:(/[[:alnum:]]+)*$)
baz@foo.org:/9foo/_#_numerics_are_fine_in_URI_and_so_is_anything_else_(virtually) =~ (?i-xsm:^[a-z][[:alnum:]_]*@[a-z][[:alnum:]_.]*:(/[^/]*)*$)

0
10.12.2008 11:52:57

После еще нескольких ревизий я использую:

/^\w+\@(\w|\.)+\:(\/\w+)*$/

который, кажется, соответствует моим тестовым сценариям и учетным записям для имен хостов, полных доменных имен и IP-адресов в части хоста. Это также делает путь после двоеточия необязательным, чтобы разрешить неявные домашние каталоги.

Спасибо за помощь до сих пор - я не заметил отсутствие имени хоста, пока оно не было указано.

0
10.12.2008 11:44:50
Могут ли имена хостов начинаться с "."?
paxdiablo 10.12.2008 12:12:00
@pax, нет, я задавался вопросом об * псевдонимах и разрешении поиска по умолчанию, но даже с обоими из них, указывающими на, казалось бы, жизнеспособное место,. как первая часть не может решить.
Kent Fredric 10.12.2008 12:35:29

ОК, дальнейшая редакция:

/^\w+\@(\w|\.)+\:(\/(\w|.)+)*$/

для учета. это может присутствовать в имени файла.

0
10.12.2008 12:06:02

Финальный ход:

/^\w+\@(\w|\.)+\:(\/(\w|.)+\/?)*$/

Это также учитывает дополнительный косой черты.

0
10.12.2008 14:48:54
Сэм, было бы лучше отредактировать исходный ответ, чтобы включить эти обновления, а не публиковать больше ответов.
paxdiablo 11.12.2008 00:12:05

Это не совсем то, что мне нужно; как некоторые были сломаны или недостаточно либеральны. Например, если у вас есть папка с именем stackoverflow.comбез точек, она сломается. Реализации противоречивы в отношении того \w, что означает, поэтому я бы не рекомендовал использовать это, тем более что мы прекрасно знаем, какие символы нам нужны.

Ниже приведен пример bash для построения регулярного выражения:

#should match 99.9% of SSH users
user_regex='[a-zA-Z][a-zA-Z0-9_]+'
#match domains
host_regex='([a-zA-Z][a-zA-Z0-9\-]*\.)*[a-zA-Z][a-zA-Z0-9\-]*'
#match paths starting with / and empty strings (which is valid for our use!)
path_regex='(\/[A-Za-z0-9_\-\.]+)*\/?'
#the complete regex
master_regex="^$user_regex\@$host_regex\:$path_regex\$"

Это дает модульность, чтобы проверить ваши детали позже, если это будет необходимо. Чтобы включить IP-адреса в совпадении, добавьте 0-9к двум частям совпадения первых букв регулярное выражение хоста.

0
27.09.2014 19:56:53