Переменные Bash и типы

scp и rsync передайте удаленные имена файлов удаленной оболочке. Это позволяет Вам передавать шаблоны, как в

scp remotehost:'*.txt' .

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

Можно передать -s опция к rsync заставить его защитить имена файлов от расширения удаленной оболочкой. Но это включает встроенное подстановочное расширение rsync, таким образом, все еще необходимо заключить в кавычки \[?*.

Обходное решение должно передать архив:

ssh -P 8484 root@172.31.72.103 'cd "/media/New Volume" && tar cf - lj' |
tar xf - -C /home/pratheep

Другой метод должен смонтировать удаленную файловую систему и затем использовать обычные инструменты для выполнения копии.

mkdir mnt
sshfs -p 8484 root@172.31.72.103:/ mnt
cp -Rp 'mnt/media/New Volume/lj' /home/pratheep
fusermount -u mnt
rmdir mnt
2
31.01.2013, 01:17
2 ответа

С немного дополнительным переписывают. (Поскольку Вы используете определенное для Bash регулярное выражение, просто заполняете BASH_REMATCH массив вместо того, чтобы управлять разделением слова.)

checkIp()
{
  local ip="$1"

  if [[ "$ip" =~ ^([0-9]{1,3})\.([0-9]{1,3}|\*)\.([0-9]{1,3}|\*)\.([0-9]{1,3}|\*)$ ]]; then
    for ((i=1;i<=4;i++)); do
      [[ "${BASH_REMATCH[i]}" == '*' || "${BASH_REMATCH[i]}" -le 255 ]] || return 1
    done

    return 0
  fi

  return 1
}

Обновление согласно комментарию владельца для запрещения чисел после “*”:

checkIp()
{
  local ip="$1"
  local asterisk=''

  if [[ "$ip" =~ ^([0-9]{1,3})\.([0-9]{1,3}|\*)\.([0-9]{1,3}|\*)\.([0-9]{1,3}|\*)$ ]]; then
    for ((i=1;i<=4;i++)); do
      [[ "${BASH_REMATCH[i]}" == '*' || ( ! "$asterisk" && "${BASH_REMATCH[i]}" -le 255 ) ]] || return 1
      [[ "${BASH_REMATCH[i]}" == '*' ]] && asterisk='1'
    done

    return 0
  fi

  return 1
}
3
27.01.2020, 21:57

Для записи, с zsh, Вы могли записать это:

[[ $ip = <0-255>.(<0-255>|"*").(<0-255>|"*").(<0-255>|"*") ]]

Обратите внимание, что это позволяет 000001.0000255.*.0, но нет 0377.1.1.1 (даже при том, что 0377 столь взятый, как восьмеричное число в диапазоне), потому что это только рассматривает десятичные числа.

2
27.01.2020, 21:57

Теги

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