'Ekran'ı salt okunur modda çalıştırmanın bir yolu var mı?


16

Mevcut screenoturumlarımın ilerlemesini ve çıktısını kontrol etmek istiyorum , ancak kullanıcı hatası nedeniyle bir şeyin yanlış gitmesini önlemek için salt okunur bir şekilde. Bunu yapmanın bir yolu var mı?

Yanıtlar:


8

Ne yazık ki, cevap hayır. Bir asker bu soruya geçti tmux bu özelliği (geçmek olduğundan özellikle -rsen çoklayıcılarını geçme seçeneği varsa bu yüzden muhtemelen en iyi seçimdir, eklerken bayrağı)


3

Deneyebilirsin:

aclchg username -w "#"

screenÇok kullanıcı modunda çalıştırırsanız (ancak tek bir bağlı kullanıcı olarak test ederken çalışmasını sağlamak için özel bir şey yapmam gerekmiyordu). Çok kullanıcılı moda girmeniz gerekiyorsa kullanın multiuser on.

*Kullanıcı adını tüm kullanıcıları etkilemek için kullanabilirsiniz .

Yazma modunu etkinleştirmek +wyerine kullanmak -w.

Gönderen man screen:

aclchg kullanıcı adları izin listesi
chacl kullanıcı adları izin listesi

Virgülle ayrılmış kullanıcı listesi izinlerini değiştirin. İzin bitleri 'r', 'w' ve 'x' olarak temsil edilir. '+' Önekinin eklenmesi '-' iznini kaldırır. Üçüncü parametre, virgülle ayrılmış komutların ve / veya pencerelerin listesidir (sayı veya başlık ile belirtilir). '#' Özel listesi tüm pencereleri ifade eder, '?' tüm komutlara. kullanıcı adları tek bir '*' işaretinden oluşuyorsa, bilinen tüm kullanıcılar etkilenir. Bir komut, kullanıcı bunun için 'x' bitine sahip olduğunda yürütülebilir. Kullanıcı, 'w' biti ayarlandığında bir pencereye girdi yazabilir ve başka hiçbir kullanıcı bu pencere için yazma kilidi almaz. Diğer bitler şu anda yok sayılmaktadır. Pencere 2'deki yazma kilidini başka bir kullanıcıdan çekmek için: 'aclchg username -w + w 2'. Oturuma salt okunur erişime izin vermek için: 'aclchg username -w "#"'. Bir kullanıcının adı ekran olarak bilinir bilinmez oturuma eklenebilir ve (varsayılan olarak) tüm komut ve pencereler için tam izinlere sahiptir. Acl komutları, `at 've diğerleri için yürütme izni de kaldırılmalıdır, aksi takdirde kullanıcı yazma iznini geri alabilir. Özel kullanıcı adının hakları değiştirilemez ("su" komutuna bakın). 'Chacl', 'aclchg' ile eşanlamlıdır. Yalnızca çoklu kullanıcı modu. ve diğerleri de kaldırılmalıdır, aksi takdirde kullanıcı yazma iznini geri alabilir. Özel kullanıcı adının hakları değiştirilemez ("su" komutuna bakın). 'Chacl', 'aclchg' ile eşanlamlıdır. Yalnızca çoklu kullanıcı modu. ve diğerleri de kaldırılmalıdır, aksi takdirde kullanıcı yazma iznini geri alabilir. Özel kullanıcı adının hakları değiştirilemez ("su" komutuna bakın). 'Chacl', 'aclchg' ile eşanlamlıdır. Yalnızca çoklu kullanıcı modu.


Bu çalışırken screen, ekran oturumunun bağlı olduğu her yerde OP'nin istediğinden farklı görünüyor.
Stéphane Chazelas

1
@StephaneChazelas: Soruda OP'nin çok bağlı bir oturumun diğer örneklerindeki yazılabilirlikten endişe duyduğuna dair herhangi bir belirti görmüyorum. Ayrıca, aclcngkomut belirli kullanıcıları, belirli komutları ve / veya belirli pencereleri belirtebilir, bu da oldukça hassas bir ayrıntı düzeyidir. Yani bu "her yerde" değil.
sonraki duyuruya kadar duraklatıldı.

3

Birinin çıktıyı güvenli bir şekilde izlemesini sağlayan oldukça basit bir çözüm buldum.

Ekran oturumuna girdikten hemen sonra aşağıdaki komutları çalıştırın:

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

Oturumu ile ayırın Ctrl-A dve komut dosyası çıktısını takip edin, örn:

tail -f /tmp/10751.test

1

Şu anki çözümüm Terminal Görünümü'nü ReadOnly olarak ayarlamaktır .

Belki çok açıktır. Ancak, soru screenkendi başına bir çözüm gerektirmedi .


1
salt okunur modu destekleyen bir terminal emülatörü ile bana iyi geliyor. ne yazık ki, birçok terminal (gnome / kde terminali iirc değil), ama bazı (xfce4-terminal gibi)
hanshenrik

0

i readscreen... salt okunur modda ekran oturumlarına eklemek denilen bir php komut dosyası yazdı . kaydedin /usr/bin/readscreenve çalıştırın chmod 0555 /usr/bin/readscreenve php-pcntl uzantısı ile php-cli yüklü olduğundan emin olun ve readscreennormal ekrana bağlanmak için hangi komutu kullanırsanız yazın yazabilirsiniz , örneğin:

readscreen -S foo -x

foo oturumuna salt okunur bir şekilde bağlanacaksınız . kapsamlı bir şekilde test edilmediğini, ancak iyi çalıştığını görünüyor. okuma ekranı kaynak kodu:

#!/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 ();
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.