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ı?
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:
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 listesiVirgü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.
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.
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
Ş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 .
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 ();
}
screen, ekran oturumunun bağlı olduğu her yerde OP'nin istediğinden farklı görünüyor.