Я полагаю, что это связано с шрифтом. В текстовом режиме используются различные шрифты, чем в X. Простое гуглинг говорит, что это может быть невозможно достичь в текстовом методе Arch Linux forum и LFS Console
-121--230125-
Так, как указывает @ muru в Я управлял всем этим, но часть unlockpt ()
. В соответствии с чем-то, что я прочитал здесь , возможно, есть некоторые параметры компиляции времени в ядре для отключения вновь созданной блокировки pty, но я не хотел этого делать. Итак, я сделал что-то другое.
На самом деле мне не нужен grantpt ()
. В соответствии с приведенным здесь описанием все, что он делает, это изменяет UID/GID для файла устройства /dev/pts/[ num]
. Но согласно человеку
есть более простые способы справиться с этим. Ниже приведены некоторые опции монтирования 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
, как рекомендовано в документации по ядру . Ссылка kernel doc, по пути, развивает опцию newinstance
mount - что довольно круто и в основном позволяет получить отдельно разнесенную по имени группу ptys на /dev/ptmx
mount.
В любом случае, так что что-то еще было в основном:
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
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 ()
на своем stdin и если успешно напечатает имя вновь созданной и разблокированной 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 экран
без столько накладных расходов и на любой файл дескриптор я выбираю.
Ведущая сторона 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 = ; eol2 = ;
swtch = ; 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
-121--74182-
Можно использовать группу процессов:
set -m
(
for part in input_*; do
(python3 "$part" || kill 0) &
done
wait
)
set -m
(и дополнительная функция оболочки POSIX, обязательная функция оболочки Unix) запускает задания в собственной группе процессов. В bash
, yash
, zsh
, mksh
, это задания субоболочки, где set -m
включен, поэтому внешний (...)
и все процессы, созданные в этой группе, будут помещены в ту же группу процессов.
Для тире
и других оболочек на основе золы
, которые работают только в процессе оболочки верхнего уровня. Так что этот код будет работать, если он не помещен в дополнительный корпус.
Это не будет работать в AT & T ksh
или старой оболочке SysV/Bourne вообще.
kill 0
посылает сигнал SIGTERM всем участникам текущей группы процессов.
Решение 2-частей:
Использование iPtables, вы можете сделать некоторые преподобные для захвата всех трафика для ABCD (удаленный сервер), а затем замаскируйте этот трафик и перенаправляйте его на EFGH (ваш IP-адрес Noip.com)
Используя скрипт CRON, запустив каждый N минут, если IP изменился, очистите правила iPTables и вставьте их новым IP.
Я не проверил его, но вот как я начну:
iptables -t nat -I PREROUTING -s [localwanip] -d [remoteip] -p -m tcp --dport [port] --to-destination [newremoteip]
... и скрипт, снова требуется проверки (результаты могут варьироваться в зависимости от версий и вкуса системного вкуса):
#!/bin/bash
NOIPNAME=yourname.noip.com
# Your IP on your WAN interface
LOCALIP=1.2.3.4
# The IP the software is _mistakenly_ trying to talk to
REMOTEIP=4.3.2.1
# The TCP port the software is using to connect to the remote IP
PORT=1234
# Just a file to keep track of what the last IP was...
REMEMBERFILE=/var/run/oldip.txt
# and now the magic, if it works...
HOSTLINE=$(host $NOIPNAME ns1.no-ip.com | grep 'has address')
HOSTLEN=$(echo $HOSTLINE | wc -m)
# Make sure the return string is > 8 characters (1.2.3.4\n)
if [ $HOSTLEN -lt 8 ]; then
# Host resolve failure
echo "Bad host"
exit 1
fi
# Extract the IP from the return string.
DYNIP=$(echo $HOSTLINE | sed -rn 's/^.* ([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}).*/\1/p')
OLDIP=$(cat $REMEMBERFILE)
if [ "x$DYNIP" = "x$OLDIP" ]; then
# Nothing to do.
exit 0
else
echo $DYNIP > $REMEMBERFILE
fi
# Flush
iptables -t nat -F
# and re-write
iptables -t nat -I PREROUTING -s $LOCALIP -d $REMOTEIP -p -m tcp --dport $PORT --to-destination $DYNIP
exit 0
наконец, добавить его крон; Ниже проходит каждые 10 минут (через эту часть: * / 10).
echo "*/10 * * * * root /your/path/to/script" >> /etc/crontab
Предостережения: Теперь iptables будет сложно, если команда, которую я дал, не работает (вероятно, не будет - это было просто предположение) - есть копаться в Google, например:
http://ribbalious.com/rewrite -Дестинация - IP-адрес - с использованием IPTables /
Удачи.
В устройстве необходимо установить IP-адрес системы Linux. Этот Linux будет выполнять NAT (iptables
, см. DNAT
). Она также будет регулярно проверять обновления DNS и соответствующим образом обновлять конфигурацию DNAT. Конечно, вы можете потерять некоторые данные из-за изменения IP-адреса.