আমি আমার বিদ্যমান screen
সেশনগুলির অগ্রগতি এবং আউটপুট পরীক্ষা করতে সক্ষম হতে চাই , তবে কেবলমাত্র পঠন পদ্ধতিতে যাতে ব্যবহারকারীর ত্রুটির কারণে কোনও কিছু ভুল হতে না পারে। এই কাজ করতে একটি উপায় আছে কি?
আমি আমার বিদ্যমান screen
সেশনগুলির অগ্রগতি এবং আউটপুট পরীক্ষা করতে সক্ষম হতে চাই , তবে কেবলমাত্র পঠন পদ্ধতিতে যাতে ব্যবহারকারীর ত্রুটির কারণে কোনও কিছু ভুল হতে না পারে। এই কাজ করতে একটি উপায় আছে কি?
উত্তর:
দুর্ভাগ্যক্রমে, আমি মনে করি উত্তরটি হ'ল না। এই প্রশ্নের প্রশ্নকর্তা বিশেষত tmux এ স্যুইচ করেছেন কারণ এটির বৈশিষ্ট্যটি রয়েছে ( -r
সংযুক্ত হওয়ার সময় আপনি পতাকাটি পাস করেন ) সুতরাং আপনার যদি মাল্টিপ্লেক্সার স্যুইচ করার বিকল্প থাকে তবে সম্ভবত এটি আপনার সেরা পছন্দ
আপনি চেষ্টা করতে পারেন:
aclchg username -w "#"
আপনি screen
যদি মাল্টি ইউজার মোডে চালিত হন (তবে এটি একক সংযুক্ত ব্যবহারকারী হিসাবে পরীক্ষার সময় এটির কাজ করার জন্য আমার বিশেষ কিছু করার দরকার নেই)। আপনার যদি মাল্টিউজার মোডে প্রবেশ করতে হয় তবে ব্যবহার করুন multiuser on
।
আপনি *
ব্যবহারকারীকে প্রভাবিত করতে ব্যবহারকারীর নামটি ব্যবহার করতে পারেন ।
ব্যবহার +w
পরিবর্তে -w
লেখার মোডটি সক্ষম করে।
থেকে man screen
:
aclchg ব্যবহারকারীর নাম অনুমতি দেওয়া তালিকা
চ্যাক ব্যবহারকারী নাম ব্যবহারকারীর তালিকাকমা দ্বারা পৃথক করা ব্যবহারকারীদের তালিকার অনুমতি পরিবর্তন করুন। অনুমতি বিটগুলি 'আর', 'ডাব্লু' এবং 'এক্স' হিসাবে উপস্থাপিত হয়। উপসর্গ '+' অনুমতি দেয়, '-' এটি সরিয়ে দেয়। তৃতীয় প্যারামিটারটি কমান্ড এবং / অথবা উইন্ডোগুলির (যা সংখ্যা বা শিরোনাম দ্বারা নির্দিষ্ট করা) একটি কমা দ্বারা পৃথক করা তালিকা। বিশেষ তালিকা '#' সমস্ত উইন্ডোকে বোঝায়, '?' সমস্ত কমান্ড। যদি ব্যবহারকারীর নামগুলিতে একটি একক '*' থাকে, সমস্ত পরিচিত ব্যবহারকারীরা প্রভাবিত হয়। একটি কমান্ড কার্যকর করা যেতে পারে যখন ব্যবহারকারীর জন্য এটি 'x' বিট রাখে। ব্যবহারকারী যখন তার উইন্ডোতে তার 'ডাব্লু' বিট সেট থাকে তখন কোনও উইন্ডোতে ইনপুট টাইপ করতে পারে এবং অন্য কোনও ব্যবহারকারী এই উইন্ডোটির জন্য কোনও রাইটলক গ্রহণ করেন না। অন্যান্য বিট বর্তমানে উপেক্ষা করা হয়। উইন্ডো 2: 'aclchg ব্যবহারকারীর নাম -w + ডাব্লু 2' এ অন্য ব্যবহারকারীর কাছ থেকে রিটেলকটি প্রত্যাহার করতে। সেশনে কেবল পঠনযোগ্য অ্যাক্সেসের অনুমতি দেওয়ার জন্য: 'aclchg ব্যবহারকারীর নাম -w "#"'। কোনও ব্যবহারকারীর নাম স্ক্রিনে পরিচিত হওয়ার সাথে সাথেই তিনি সেশনে সংযুক্ত করতে পারেন এবং (প্রতিটি ডিফল্ট) সমস্ত কমান্ড এবং উইন্ডোজের জন্য সম্পূর্ণ অনুমতি রয়েছে। এসিএল কমান্ডগুলির জন্য এক্সিকিউশন অনুমতি, 'এট' এবং অন্যদেরও অপসারণ করা উচিত বা ব্যবহারকারী লেখার অনুমতি পুনরায় অর্জন করতে সক্ষম হতে পারে। বিশেষ ব্যবহারকারীর নাম কারও অধিকার পরিবর্তন করা যায় না ("su" কমান্ড দেখুন)। 'চ্যাক' 'অ্যাক্ল্যাচজি' এর প্রতিশব্দ। একাধিক ব্যবহারকারী মোড। এবং অন্যদেরও অপসারণ করা উচিত বা ব্যবহারকারী লেখার অনুমতি পুনরায় পেতে সক্ষম হতে পারে। বিশেষ ব্যবহারকারীর নাম কারও অধিকার পরিবর্তন করা যায় না ("su" কমান্ড দেখুন)। 'চ্যাক' 'অ্যাক্ল্যাচজি' এর প্রতিশব্দ। একাধিক ব্যবহারকারী মোড। এবং অন্যদেরও অপসারণ করা উচিত বা ব্যবহারকারী লেখার অনুমতি পুনরায় পেতে সক্ষম হতে পারে। বিশেষ ব্যবহারকারীর নাম কারও অধিকার পরিবর্তন করা যায় না ("su" কমান্ড দেখুন)। 'চ্যাক' 'অ্যাক্ল্যাচজি' এর প্রতিশব্দ। একাধিক ব্যবহারকারী মোড।
aclcng
কমান্ডটি নির্দিষ্ট ব্যবহারকারী, নির্দিষ্ট কমান্ড এবং / অথবা নির্দিষ্ট উইন্ডোজ নির্দিষ্ট করতে পারে যাতে এটি মোটামুটি সূক্ষ্ম গ্রানুলারিটি। সুতরাং এটি "সর্বত্র" নয়।
আমি মোটামুটি সহজ কাজ খুঁজে পেয়েছি যা একজনকে আউটপুটটিকে নিরাপদে পর্যবেক্ষণ করতে দেয়।
স্ক্রিন সেশনে প্রবেশের সাথে সাথে নিম্নলিখিত কমান্ডগুলি চালনা করুন:
echo /tmp/$STY
touch /tmp/$STY
chmod 0600 /tmp/$STY
script -a -f /tmp/$STY
Ctrl-A dস্ক্রিপ্ট আউটপুট সহ সেশনটি আলাদা করুন এবং অনুসরণ করুন:
tail -f /tmp/10751.test
আমার এটির বর্তমান সমাধানটি টার্মিনাল ভিউটি কেবলমাত্র পঠনযোগ্যতে সেট করা ।
সম্ভবত এটি খুব সুস্পষ্ট। তবে, প্রশ্নটির screen
নিজের দ্বারা কোনও সমাধানের প্রয়োজন হয়নি ।
আমি পিএইচপি স্ক্রিপ্ট লিখেছিলাম readscreen
... যা কেবলমাত্র পঠন মোডে স্ক্রিন সেশনগুলিতে সংযুক্ত করুন। এটিকে সংরক্ষণ করুন /usr/bin/readscreen
এবং চালান chmod 0555 /usr/bin/readscreen
, এবং পিএইচপি-পিসেন্টল এক্সটেনশান সহ পিএইচপি-ক্লিপ ইনস্টল করা আছে তা নিশ্চিত করুন এবং আপনি 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
স্ক্রিন সেশনটি সংযুক্ত থাকা যেকোন জায়গায় পঠনযোগ্য করে তোলে যা দেখতে ওপি যা বলেছিল তার চেয়ে আলাদা।