Как я приезжаю этим имуществом и что я могу сделать с ним?

В дополнение к ответу хорошего @dartonw, если Вам нравится использовать сценарий удара, чтобы сделать простой двухсторонний синхронизатор, можно использовать rsync этот путь

#!/bin/sh
exitcode=1 
#do check if usb flash is mounted
if test -e '/your_path_to_usb_mountpoint';then 
exitcode=0
#from folder to usb if the files are newers
rsync -avun --inplace  /your_folder_wich_you_want_to_syncronize/ /your_path_to_usb_mountpoint ;
#from usb to folder if the files are newers
rsync -avun --inplace /your_path_to_usb_mountpoint/ /your_folder_wich_you_want_to_syncronize/ 
fi 
#if the flash is not mounted exit with exitcode=1 
exit $exitcode
5
15.01.2015, 00:18
1 ответ

Итак, как отмечает @muru в комментариях, похоже, нет простого способа связать созданный для вас pty с помощью только оболочки. Мне удалось все это, но часть unlockpt () . Согласно тому, что я прочитал здесь , возможно, в ядре есть некоторые параметры времени компиляции для отключения вновь созданной блокировки pty, но я не хотел этого делать. Итак, я сделал кое-что еще.

На самом деле мне не нужна была grantpt () . Согласно описанию, найденному здесь , все, что он делает, это изменяет UID / GID для / dev / pts / [num] файла устройства. Но согласно man mount есть более простые способы справиться с этим. Вот некоторые параметры монтирования devpts :

  • uid = value и gid = value
    • Устанавливает указанные значения для владельца или группы вновь созданных PTY. Если ничего не указано, им будут присвоены UID и GID процесса создания. Например, если существует группа tty с GID 5, то gid = 5 приведет к тому, что вновь созданные PTY будут принадлежать группе tty .

Так было в моей системе по умолчанию. Но после прочтения я понял, что, возможно, все-таки захочу внести изменения. В следующем разделе говорится:

  • ptmxmode = value
    • Установите режим для нового узла устройства ptmx в файловой системе devpts .
    • Благодаря поддержке нескольких экземпляров devpts (см. Параметр newinstance выше), каждый экземпляр имеет частный узел ptmx в корне файловой системы devpts (обычно / dev / pts / ptmx ) .
    • Для совместимости со старыми версиями ядра режим по умолчанию нового узла ptmx - 0000 . ptmxmode = value указывает более удобный режим для узла ptmx и настоятельно рекомендуется, когда указана опция newinstance .

Хотя это сработало бы и без этого, мне понравилась идея, и я установил для него значение 0640 , как рекомендовано в документации ядра . Ссылка на документ ядра, кстати, подробно описывает параметр монтирования newinstance , который довольно крутой и в основном позволяет вам получить отдельную группу ptys с разделением имен на / dev / ptmx устанавливать.

Так или иначе, что-то еще в основном составляло:

mount -o remount,newinstance,gid=5,ptmxmode=0640 /dev/pts
mount --bind /dev/pts/ptmx /dev/ptmx

... как рекомендуют документы ядра - см. Ссылку о том, почему. Я также сделал действие вышеуказанных команд постоянным, добавив пару строк в свой / etc / fstab .

И ...

<<\C cc -xc - -o pts
#include <stdio.h>
int main(int argc, char *argv[]) {
        if(unlockpt(0)) return 2;
        char *ptsname(int fd);
        printf("%s\n",ptsname(0));
        return argc - 1;
}
C

Которая просто компилирует крошечную программу на C, которая пытается вызвать unlockpt () на своем стандартном вводе и в случае успеха выводит имя вновь созданного и разблокированного pty в ] stdout или молча возвращает 2.

Как только это будет сделано, я могу создать свои собственные экранированные процессы, например:

exec 3<>/dev/ptmx

...чтобы получить fd на стороне мастера в текущей оболочке, тогда ...

(setsid -c "$0" -i 2>&1|tee log) <>"$(./pts <&3)" 3>&- >&0 &

Это запускает интерактивную оболочку на другом конце псевдотерминала в фоновом режиме. Он интерпретирует все, что напечатано в > & 3 , как вводимые пользователем.

mikeserv@localhost$ echo echo hey >&3
mikeserv@localhost$ cat log
$ hey
$
mikeserv@localhost$ echo echo hey >&3
mikeserv@localhost$ cat log
$ hey
$ hey
$ 

Что в основном дает мне фоновый, регистрируемый, интерактивный интерпретатор (или что-нибудь еще, что я могу запустить на них) ala screen без особых накладных расходов и на любом дескрипторе файла. выберите.

Главный fd, принадлежащий моей текущей оболочке, является единственным средством обслуживания ввода ведомой стороны и доступен для записи только моему текущему процессу оболочки (и его дочерним элементам) . Я могу связаться с другим концом, написав на > & 3 , и я могу читать из того же файла или из файла журнала, как захочу.

И stty все-таки работает на терминале:

mikeserv@localhost$ echo stty -a ">$(tty)" >&3
speed 38400 baud; rows 0; columns 0; line = 0;                                      
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>;
swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W;
lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc
-ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl
echoke
4
27.01.2020, 20:40

Теги

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