Если кому-то еще интересен ответ...
Кажется, что способ достичь этого - это пересылаемый билет kerberos. Затем билет можно переслать с помощью gssapi, а на стороне сервера этот билет можно использовать с помощью команды ksu в вопросе, чтобы породить процесс от имени указанного пользователя.
ksu kerbuser -c "/bin/bash authed-process.py"
Эта команда будет искать в кэше пользователя билет kerberos, а затем запускать процесс. Однако клиент-серверный gssapi должен быть привилегированным, поскольку только привилегированные (root) пользователи могут просматривать файл keytab.
Насколько мне известно, не существует команды, которую можно выполнить в оболочке внутри сеанса screen
для отключения терминала от этого сеанса. screen
просматривает только ввод с вашего терминала для магического метасимвола(Ctrl-a ), а не что-либо, отображаемое в сеансе терминала, управляемом самимscreen
. Для демонстрации я создал файл с именем detachsequence
, который содержит Ctrl-символ , за которым следует символ d
:
$ hexdump detachsequence
0000000 01 64
Если я cat
сделаю это внутри screen
сеанса, ничего (примечательного )не произойдет; файл будет просто отображаться (, несмотря на невидимый управляющий символ):
$ cat detachsequence
d
echo
или printf
также ничем не примечательны.
На самом деле, было бы особенно серьезным недостатком безопасности, если бы cat
ting файл внутри screen
мог отправлять управляющие последовательности самому screen
.
Нажатия клавиши Ctrl-<letter>
отправляют коды символов от 1 до 26 для букв от A
до Z
. То есть Ctrl -A или ^A
отправляет символ 1, или \x01
или \001
, ^B
— 2 и т. д. Возврат каретки — \015
или 13 (десятичное )или ^M
.
Итак, Ctrl-A d
будет \001d
.
Однако, если вы хотите отправить эту последовательность так, как ее screen
интерпретирует, это не так просто сделать изнутри самого экрана. (Вы можете сделать это с терминала за пределами из screen
.)
Более простой способ попросить screen
отсоединиться от сценария — запустить screen -X detach
, возможно, также используя -S
, чтобы указать, какой экран вы хотите отсоединить, и используя переменную среды STY
, чтобы найти идентификатор текущий экран.
Универсальным решением может быть:
screen -d $STY
Screen передаст имя сеанса в переменную $STY
, после чего вы сможете использовать с ней screen -d
.
Вероятно, вы захотите запустить команду в автономном режиме, это можно сделать следующим образом:
screen -d $STY & yourcommand
Примечание:screen -d
само по себе достаточно. Вам не нужно указывать $STY
.
Вы также можете запустить сценарий, который изначально отсоединен:
screen -d -m /the/script
Но это будет иметь оговорку, что у вас не будет временных рамок, в течение которых вы можете взаимодействовать со сценарием, пока он не будет отсоединен. Если вам это нужно, предыдущее решение должно быть подходящим.
Другое решение (, которое зависит от среды):
Если вы используете скрипт на виртуальном терминале в сеансе X
, вы можете использовать xdotool
для отправки управляющей последовательности на терминал:
xdotool key control+a+d