मैं अपने मौजूदा screen
सत्रों की प्रगति और आउटपुट की जांच करने में सक्षम होना चाहता हूं , लेकिन केवल-पढ़ने के तरीके में, ताकि उपयोगकर्ता त्रुटि के कारण कुछ गलत होने से रोका जा सके। क्या इसे करने का कोई तरीका है?
मैं अपने मौजूदा screen
सत्रों की प्रगति और आउटपुट की जांच करने में सक्षम होना चाहता हूं , लेकिन केवल-पढ़ने के तरीके में, ताकि उपयोगकर्ता त्रुटि के कारण कुछ गलत होने से रोका जा सके। क्या इसे करने का कोई तरीका है?
जवाबों:
तुम कोशिश कर सकते हो:
aclchg username -w "#"
यदि आप screen
मल्टी यूजर मोड में दौड़ते हैं (लेकिन मुझे इसे एक संलग्न उपयोगकर्ता के रूप में परीक्षण करते समय काम करने के लिए कुछ विशेष करने की आवश्यकता नहीं थी)। यदि आपको मल्टीसियर मोड में प्रवेश करने की आवश्यकता है, तो उपयोग करें multiuser on
।
आप *
सभी उपयोगकर्ताओं को प्रभावित करने के लिए उपयोगकर्ता नाम का उपयोग कर सकते हैं ।
राइट मोड +w
को -w
सक्षम करने के बजाय उपयोग करना ।
से man screen
:
aclchg उपयोगकर्ता नाम परमिट सूची
chacl उपयोगकर्ता नाम परमिट सूचीउपयोगकर्ताओं की अल्पविराम से अलग की गई सूची के लिए अनुमतियां बदलें। अनुमति बिट्स को 'आर', 'डब्ल्यू' और 'एक्स' के रूप में दर्शाया जाता है। उपसर्ग '+' की अनुमति देता है, '-' इसे हटा देता है। तीसरा पैरामीटर कमांड और / या विंडोज़ की अल्पविराम से अलग की गई सूची है (या तो संख्या या शीर्षक द्वारा निर्दिष्ट)। विशेष सूची '#' सभी विंडो को संदर्भित करती है, '?' सभी आदेशों के लिए। यदि उपयोगकर्ता नाम में एक '*' होता है, तो सभी ज्ञात उपयोगकर्ता प्रभावित होते हैं। जब उपयोगकर्ता के पास इसके लिए 'x' बिट होता है, तो एक कमांड निष्पादित किया जा सकता है। उपयोगकर्ता एक विंडो में इनपुट टाइप कर सकता है जब उसके पास 'w' बिट सेट होता है और कोई अन्य उपयोगकर्ता इस विंडो के लिए रिटेलॉक प्राप्त नहीं करता है। वर्तमान में अन्य बिट्स को अनदेखा किया गया है। विंडो 2 में किसी अन्य उपयोगकर्ता से रिटेलॉक वापस लेने के लिए: 'aclchg उपयोगकर्ता नाम -w + w 2'। सत्र में केवल पढ़ने के लिए उपयोग की अनुमति देने के लिए: 'aclchg उपयोगकर्ता नाम -w "#"। जैसे ही एक उपयोगकर्ता का नाम स्क्रीन पर जाना जाता है, वह सत्र में संलग्न हो सकता है और (प्रति डिफ़ॉल्ट) सभी आदेशों और खिड़कियों के लिए पूर्ण अनुमति है। Acl कमांड के लिए निष्पादन अनुमति, 'at' और अन्य को भी हटा दिया जाना चाहिए या उपयोगकर्ता लिखित अनुमति प्राप्त करने में सक्षम हो सकता है। विशेष उपयोगकर्ता नाम के अधिकारों को बदला नहीं जा सकता ("सु" कमांड देखें)। 'Chacl ’cl aclchg’ का एक पर्याय है। केवल बहु उपयोगकर्ता मोड। और दूसरों को भी हटा दिया जाना चाहिए या उपयोगकर्ता लिखित अनुमति प्राप्त करने में सक्षम हो सकता है। विशेष उपयोगकर्ता नाम के अधिकारों को बदला नहीं जा सकता ("सु" कमांड देखें)। 'Chacl ’cl aclchg’ का एक पर्याय है। केवल बहु उपयोगकर्ता मोड। और दूसरों को भी हटा दिया जाना चाहिए या उपयोगकर्ता लिखित अनुमति प्राप्त करने में सक्षम हो सकता है। विशेष उपयोगकर्ता नाम के अधिकारों को बदला नहीं जा सकता ("सु" कमांड देखें)। 'Chacl ’cl aclchg’ का एक पर्याय है। केवल बहु उपयोगकर्ता मोड।
aclcng
कमांड विशेष उपयोगकर्ताओं, विशेष आदेशों और / या विशेष खिड़कियों को निर्दिष्ट कर सकती है ताकि यह काफी बारीक हो। तो यह "हर जगह" नहीं है।
मैंने एक काफी सरल काम पाया है, जो किसी को आउटपुट को सुरक्षित रूप से मॉनिटर करने की अनुमति देता है।
स्क्रीन सत्र में प्रवेश करने के तुरंत बाद निम्नलिखित कमांड चलाएँ:
echo /tmp/$STY
touch /tmp/$STY
chmod 0600 /tmp/$STY
script -a -f /tmp/$STY
Ctrl-A dस्क्रिप्ट आउटपुट के साथ सत्र को अलग करें और उदाहरण के लिए:
tail -f /tmp/10751.test
इसका मेरा वर्तमान समाधान टर्मिनल व्यू को ReadOnly पर सेट करना है ।
शायद यह बहुत स्पष्ट है। हालाँकि, इस प्रश्न के लिए screen
स्वयं समाधान की आवश्यकता नहीं थी ।
मैंने एक php स्क्रिप्ट लिखी readscreen
... जिसे रीड-ओनली मोड में स्क्रीन सेशन में अटैच किया गया। इसे सहेजें /usr/bin/readscreen
और चलाएं chmod 0555 /usr/bin/readscreen
, और सुनिश्चित करें कि php-cli को php-pcntl एक्सटेंशन के साथ स्थापित किया गया है, और आप readscreen
उदाहरण के लिए सामान्य स्क्रीन से जुड़ने के लिए जो भी कमांड का उपयोग करेंगे, उसके बाद लिख सकते हैं :
readscreen -S foo -x
और आप पढ़े- लिखे अंदाज में फू सत्र से जुड़े रहेंगे । ध्यान दें कि यह बड़े पैमाने पर परीक्षण नहीं किया गया है, लेकिन ठीक काम करता है। स्रोत कोड:
#!/usr/bin/env php
<?php
declare(ticks = 1);
init_signals ();
$args = $argv;
unset ( $args [0] );
$args = implode ( " ", array_map ( 'escapeshellarg', $args ) );
// var_dump ( $argc, $argv, $args );
$cmd = "screen {$args}";
echo "executing cmd: $cmd\n";
$descriptorspec = array (
0 => array (
"pipe",
"rb"
) // stdin
);
$cwd = NULL;
$env = NULL;
global $screen;
$screen = proc_open ( "script --quiet --return --command " . escapeshellarg ( $cmd )." /dev/null", $descriptorspec, $pipes, $cwd, $env );
global $screen_stdin;
$screen_stdin = $pipes [0];
if (false === $screen) {
echo ("error: failed creating screen process: ");
var_dump ( error_get_last () );
die ( 1 );
}
//fclose(STDIN);
while ( 1 ) {
//echo ".";
sleep ( 1 );
if (! proc_get_status ( $screen ) ['running']) {
echo "error: screen stopped.\n";
cleanup ();
die ( 1 );
}
}
function cleanup() {
global $screen;
global $screen_stdin;
echo "detaching from screen. (running cleanup() )\n";
fwrite ( $screen_stdin, "\01" ); // equivalent of ctrl+AD apparently.
fclose ( $screen_stdin );
$exited = false;
// give it a few seconds to exit itself before killing it
for($i = 0; $i < 3; ++ $i) {
if (! proc_get_status ( $screen ) ['running']) {
$exited = true;
break;
}
sleep ( 1 );
}
if (! $exited) {
echo "Warning: screen did not exit gracefully, killing it now..";
proc_terminate ( $screen, SIGKILL );
while ( proc_get_status ( $screen ) ['running'] ) {
echo ".";
sleep ( 1 );
}
echo "killed.";
}
proc_close ( $screen );
}
function init_signals() {
global $signals;
// all signals that cause termination by default.
$signals = [
"SIGABRT",
"SIGALRM",
"SIGFPE",
"SIGHUP",
"SIGILL",
"SIGINT",
// "SIGKILL",
"SIGPIPE",
"SIGQUIT",
"SIGSEGV",
"SIGTERM",
"SIGUSR1",
"SIGUSR2",
"SIGBUS",
"SIGPOLL",
"SIGPROF",
"SIGSYS",
"SIGTRAP",
"SIGVTALRM",
"SIGXCPU",
"SIGXFSZ"
];
$signals_new = [ ];
foreach ( $signals as $key => $signal ) {
$tmp = constant ( $signal );
if ($tmp === null) {
fprintf ( STDERR, "warning: unknown signal \"%s\", may not be able to handle it without passing it to screen...\n", $singal );
unset ( $signals [$key] );
continue;
}
$signals_new [$signal] = $tmp;
}
$signals = $signals_new;
unset ( $signals_new );
foreach ( $signals as $num ) {
pcntl_signal ( $num, "signal_handler" );
}
}
function signal_handler($signo, $siginfo) {
global $signals;
$sname = array_search ( $signo, $signals, false );
if ($sname === false) {
$sname = "unknown signal";
}
echo "\n\nerror: got signal " . $signo . " (" . $sname . "), exiting screen session & returning.\n";
var_dump ( $siginfo );
cleanup ();
die ();
}
screen
हर जगह आसानी से बनाता है स्क्रीन सत्र जुड़ा हुआ है जो दिखता है कि ओपी ने जो पूछा है उससे अलग है।