В дополнение к ответу хорошего @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
Итак, как отмечает @muru в комментариях, похоже, нет простого способа связать созданный для вас pty с помощью только оболочки. Мне удалось все это, но часть unlockpt ()
. Согласно тому, что я прочитал здесь , возможно, в ядре есть некоторые параметры времени компиляции для отключения вновь созданной блокировки pty, но я не хотел этого делать. Итак, я сделал кое-что еще.
На самом деле мне не нужна была grantpt ()
. Согласно описанию, найденному здесь , все, что он делает, это изменяет UID / GID для / dev / pts / [num]
файла устройства. Но согласно man mount
есть более простые способы справиться с этим. Вот некоторые параметры монтирования devpts
:
uid = value
и gid = value
gid = 5
приведет к тому, что вновь созданные PTY будут принадлежать группе tty . Так было в моей системе по умолчанию. Но после прочтения я понял, что, возможно, все-таки захочу внести изменения. В следующем разделе говорится:
ptmxmode = value
devpts
. devpts
(см. Параметр newinstance
выше), каждый экземпляр имеет частный узел ptmx в корне файловой системы devpts
(обычно / dev / pts / 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