Как я использую вставленные значения с помощью getopts

[116058] Я думаю, что вы, возможно, сможете достичь желаемого с помощью сетевых блочных устройств (NBD). Глядя на страницу википедии [116524]по теме[116525], можно увидеть упоминание об инструменте под названием [116526]nbd[116527]. Он состоит из клиентского и серверного компонентов.

Пример

В этом сценарии я настраиваю CDROM на своем ноутбуке (сервере) Fedora 19 и делю его с системой Ubuntu 12.10 (клиент).

устанавливаю

делю CD

Теперь, возвращаясь на сервер (Fedodra 19), я делаю аналогичную вещь с помощью его менеджера пакетов YUM. После завершения я вставляю компакт-диск и запускаю эту команду, чтобы поделиться им как блочным устройством:

ssh -T git@github.com

Быстрая проверка, чтобы убедиться, что он работает:

Монтаж CD


Теперь вернемся к клиенту Ubuntu, нам нужно подключиться к [116534]nbd-серверу[116535], используя [116536]nbd-клиент[116537], подобным образом. [116538]ПРИМЕЧАНИЕ:[116539] в данном примере имя nbd-сервера - greeneggs.

  • (На некоторых системах - например, Fedora - сначала нужно [116540]modprobe nbd[116541].)

Мы можем подтвердить, что теперь на системе Ubuntu есть блочное устройство, используя [116542]lsblk[116543]:


А теперь монтируем его:

сработало ли?

Подвеска меня убивает, и мы поднимаем:

Есть содержимое LiveCD CentOS, который я смонтировал в ноутбуке Fedora 19 и смог смонтировать его в качестве блочного устройства сети на Ubuntu.[116087]:


И теперь мы смонтируем его:[116542]lsblk[116543]:


И теперь мы смонтируем его:

Сработало?

2
27.02.2015, 17:27
3 ответа

При использовании socat на сервере

socat tcp-listen:8001,reuseaddr,fork tcp:localhost:8000

По умолчанию socat прослушивает порт TCP 8001 любой IPv4 или адрес IPv6 (если поддерживается) на компьютере. Вы можете ограничить его IPv4/6, заменив tcp-listen на tcp4-listen или tcp6-listen , или на определенный локальный адрес, добавив , bind = that-address .

Для подключаемого сокета, к которому выполняется прокси, можно использовать любой адрес вместо localhost и заменить tcp на tcp4 или tcp6 , если требуется ограничить разрешение адреса IPv4 или IPv6 адресами.

Обратите внимание, что для сервера, прослушивающего порт 8000, подключение будет отображаться как исходящее от прокси (в случае localhost , то есть localhost ), а не от исходного клиента. Необходимо использовать DNAT-подходы (но которые требуют привилегий суперпользователя), чтобы сервер мог определить, кто является клиентом.

-121--4952-

Неподходящий ответ, но он слишком длинный для комментария:

В зависимости от данных на каждом из дисков можно попытаться сжать dd образ самого сжимаемого жесткого диска, затем dd этого диска на следующий диск (используя dd, если =/dev/sda of =/dev/sdc или любые другие имена дисков), dd он возвращается на исходный диск ( sda в моем предыдущем примере) путем выполнения gzcat для переноса данных в окончательный dd (аналогично тому, что они делают здесь ).

Вы также можете попытаться максимально сжать соответствующие разделы и только взять dd изображение отдельных разделов, чтобы увидеть, экономит ли это вам больше места.

-121--93157-

Это потому, что вся ваша логика зависит от того, что один из $ OPT _ [AB] имеет значение null. Но даже если вы не передаете параметр - [ab] $ OPTARG , вы по-прежнему устанавливаете их в верхней части сценария с помощью OPT _ [AB] = [AB] . Так что ваши логические цепочки никогда не проходят корень...

if [[ -z $OPT_A ]]; then...

... заявление.

Ну... От этого зависит не вся ваша логика. Вы также делаете:

shift $((OPTIND-1))

    while [ $# -ne 0 ]...

Так что если вы передали script -a arg , то getopts установит $ OPT _ A в arg и $ OPTIND придет в 3. Таким образом, необходимо сдвинуть 2 (все позиционные позиции) , затем немедленно завершить тест в , пока . Итак, ваш случай установит $ OPT _ A , и следующее, что произойдет - exit 0 . Так что я думаю, вы даже никогда не сможете проверить пустую $ OPT _ A в любом случае.

И даже это было бы нормально, поскольку большая часть вашей логики предназначена для проверки на отказ - но ваш сценарий только выход .Вы, вероятно, делаете $ OPT _ A var, но ничего с этим не делаете. Вы не можете использовать это значение после завершения сценария - не без предустановленного IPC, но здесь ничего из этого нет. Сценарий вызывается во вложенной оболочке, и заданные им значения теряются при возвращении к родительской оболочке.

Более того, optstring : a: b не допускает $ OPTARG до -b . Ведущая двоеточие в optstring означает тихую операцию - она не записывает в stderr , если есть проблема с опциями или их аргументами. Но двоеточие , задающее символ опции, означает, что опция должна ожидать аргумент. Например:

while getopts :a:b: FLAG

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

sh -c 'getopts :a:b: opt -a; echo "$opt $OPTARG"'

... который печатает...

: a

В этом случае опция наматывается в $ OPTARG , а : - в $ opt . Более ясно, если мы меньше : тихо об этом:

sh -c 'getopts a:b: opt -a; echo "$opt $OPTARG"'
No arg for -a option

Итак, вам нужно проверить для : двоеточие и для ? - который является другим типом ошибки и который традиционно перенаправляется, чтобы напечатать некоторые короткие -help типа вещи.

Лично я бы убедился, что $ OPT _ [AB] оба пусты, чтобы начать с, сделать какую-то логику на настройку их правильно, и, пройдя с тестовым циклом, сделать мой последний тест для нулевого значения. Если они вообще не имеют никакого значения, то это должно быть по какой-то причине я не обработал, и это ошибка, независимо от того. Вот начало того, как я буду работать с этим тестовым циклом...

param_err(){
    set '' "$@"
    : "${1:?Parameter '$OPTARG' does not look like an IP Address $2}"
}

test_oct(){ 
    oIFS=$IFS; unset "${IFS+o}oIFS"; IFS=.
    for oct in $1; do  [ $oct -lt 256 ] || 
        param_err "('$oct' too large)"
    done; unset IFS oct
    : "${oIFS+${IFS=$oIFS}}"
}

a_param()
    case ${1##*.*.*.*.*} in (a) OPT_A=A;;  #some default - no arg provided                                            
          (.*|*..*|*.) param_err '(empty octet)';;
          (*[!.0-9]*)  param_err '(octet is not positive integer)';;
          (*.*.*.*)    test_oct  "$1"; OPT_A=$1;;
          (*?*)        param_err '(too few octets)';;
          (*)          param_err ${1:+"(too many octets)"} '(null param)';;
    esac

unset OPT_A OPT_B
while getopts :a:b:c:d: opt
do    case ${opt#:}$OPTARG in
      a*)   a_param "$OPTARG";;
      b*)   b_param "$OPTARG";; #tests as needed similar to a_param()
      ?*)   help;;              #param_err should call this too, but it just exits
      esac
done                
2
27.01.2020, 22:12

Попробуйте изменить это: в то время как Гуманы: флаг: A: B; Сделайте

к этому: пока титулки: A: B: flag; делать

0
27.01.2020, 22:12

У вас нет строки шебанга в верхней части, поэтому оболочка вы используете ( SH , Dash ), скорее всего, не поддерживает [[. Вы должны начать скрипт с помощью:

#!/bin/bash

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

0
27.01.2020, 22:12

Теги

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