क्या रीड-ओनली मोड में 'स्क्रीन' चलाने का कोई तरीका है?


16

मैं अपने मौजूदा screenसत्रों की प्रगति और आउटपुट की जांच करने में सक्षम होना चाहता हूं , लेकिन केवल-पढ़ने के तरीके में, ताकि उपयोगकर्ता त्रुटि के कारण कुछ गलत होने से रोका जा सके। क्या इसे करने का कोई तरीका है?

जवाबों:


8

दुर्भाग्य से, मुझे लगता है कि उत्तर नहीं है। की प्रश्नकर्ता इस सवाल पर स्विच tmux विशेष रूप से, क्योंकि यह है कि सुविधा (आप पारित है -rझंडा जब संलग्न), इसलिए यदि आप multiplexers स्विच करने का विकल्प है यह शायद तुम्हारा सबसे अच्छा विकल्प है


3

तुम कोशिश कर सकते हो:

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’ का एक पर्याय है। केवल बहु उपयोगकर्ता मोड।


जबकि वह काम करता है, यह screenहर जगह आसानी से बनाता है स्क्रीन सत्र जुड़ा हुआ है जो दिखता है कि ओपी ने जो पूछा है उससे अलग है।
स्टीफन चेज़लस

1
@StephaneChazelas: मैं इस सवाल में कोई संकेत नहीं देखता कि ओपी एक बहु-संलग्न सत्र के अन्य उदाहरणों में लेखन क्षमता के बारे में चिंतित है। इसके अलावा, aclcngकमांड विशेष उपयोगकर्ताओं, विशेष आदेशों और / या विशेष खिड़कियों को निर्दिष्ट कर सकती है ताकि यह काफी बारीक हो। तो यह "हर जगह" नहीं है।
अगली सूचना तक रोक दिया गया।

3

मैंने एक काफी सरल काम पाया है, जो किसी को आउटपुट को सुरक्षित रूप से मॉनिटर करने की अनुमति देता है।

स्क्रीन सत्र में प्रवेश करने के तुरंत बाद निम्नलिखित कमांड चलाएँ:

echo /tmp/$STY
touch /tmp/$STY
chmod 0600 /tmp/$STY
script -a -f /tmp/$STY

Ctrl-A dस्क्रिप्ट आउटपुट के साथ सत्र को अलग करें और उदाहरण के लिए:

tail -f /tmp/10751.test

1

इसका मेरा वर्तमान समाधान टर्मिनल व्यू को ReadOnly पर सेट करना है ।

शायद यह बहुत स्पष्ट है। हालाँकि, इस प्रश्न के लिए screenस्वयं समाधान की आवश्यकता नहीं थी ।


1
मेरे लिए अच्छा लगता है, एक टर्मिनल एमुलेटर के साथ जो केवल पढ़ने के लिए मोड का समर्थन करता है। दुर्भाग्य से, कई टर्मिनल (gnome / kde टर्मिनल iirc नहीं करता है), लेकिन कुछ करते हैं (जैसे
xfce4-

0

मैंने एक 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 ();
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.