Регулярное выражение для соответствия строке подключения ssh - PullRequest
2 голосов
/ 10 декабря 2008

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

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

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

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

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

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

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

, который не работает должным образом.

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

Ответы [ 7 ]

2 голосов
/ 10 декабря 2008

В вашем регулярном выражении нет раздела имени хоста. Попробуйте:

/^[: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 уже long time) К сожалению, это делает мои регулярные выражения неловкими (см. Выше) и не слишком интернационализируемыми. Извиняюсь за это.

0 голосов
/ 27 сентября 2014

Это не совсем то, что нужно I ; как некоторые были сломаны или недостаточно либеральны. Например, если у вас есть папка с именем 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 голосов
/ 10 декабря 2008

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

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

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

0 голосов
/ 10 декабря 2008

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

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

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

0 голосов
/ 10 декабря 2008

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

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

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

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

0 голосов
/ 10 декабря 2008

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

/^[: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 декабря 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...