рд╣рдо PHP рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡реЗрдм-рдЖрдзрд╛рд░рд┐рдд рдЯрд░реНрдорд┐рдирд▓ рдПрдореБрд▓реЗрдЯрд░ рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧреЛрдВ рдиреЗ рдкреАрдПрдЪрдкреА рдореЗрдВ рдЕрдкрдиреЗ рдЯрд░реНрдорд┐рдирд▓ рдПрдореБрд▓реЗрдЯрд░ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛ рдерд╛, рдФрд░ рдЖрдорддреМрд░ рдкрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреИрд╕реЗ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдкрд░ рдмрд╕реЗ рдереЗ:
<?php echo '<form><input name="cmd" /></form>'; if(isset($_GET['cmd'])) system($_GET['cmd']); 

рдмреЗрд╢рдХ, рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдорд╛рдзрд╛рди рд╕реЗ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдПрдХ рдкреВрд░рд╛ рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рд╣реАрди рдпрд╣ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕реНрдХреНрд░реАрди рдкрд░ рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИред рдмрд╣реБрдд рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЪреАрдЬреЗрдВ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, vi рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдХреЗрд╡рд▓ рдХрдорд╛рдВрдб рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ "рдирд┐рд▓рдВрдмрд┐рдд" рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЖрдкрдХреЛ рдПрдХ рдирдпрд╛ рдХрдВрд╕реЛрд▓ рдЦреЛрд▓рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ killall vi рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред рдФрд░ рдЬреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рд╡рд╣ ssh рдпрд╛ sudo рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЯрд░реНрдорд┐рдирд▓ рд╕реЗ рд╕реАрдзреЗ рдкрд╛рд╕рд╡рд░реНрдб рдкрдврд╝рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдореИрдВ рдПрдХ рдРрд╕рд╛ рд░рд╛рд╕реНрддрд╛ рджрд┐рдЦрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЖрдк рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╣рдо PHP рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЯрд░реНрдорд┐рдирд▓ рдПрдореБрд▓реЗрдЯрд░ рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ


рд╣рдорд╛рд░реЗ рдЯрд░реНрдорд┐рдирд▓ рдПрдореБрд▓реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:

рд╢рд╛рдпрдж, JSLinux рдХреЗ рд▓рд┐рдВрдХ рдХреЛ рджреЗрдЦрдХрд░, рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдиреЗ рд▓рдЧреЗ рдХрд┐ рд╣рдо рдХреНрдпрд╛ рдХрд░реЗрдВрдЧреЗ;)ред

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░


PHP рдкреНрд░рд▓реЗрдЦрди рдХрд╛ рдХрд╣рдирд╛ рд╣реИ рдХрд┐ proc_open () рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде рджреЛ-рддрд░рдлрд╝рд╛ рд╕рдВрдЪрд╛рд░ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рд░реВрдк рд╕реЗ рдмреИрд╢ рдЦреЛрд▓реЗрдВрдЧреЗ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВрдЧреЗред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, PHP рдореЗрдВ рдЫрджреНрдо-рдЯрд░реНрдорд┐рдирд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдмреЙрдХреНрд╕ рд╕рдорд░реНрдерди рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рд╕реА рдореЗрдВ рдкрд░рдд рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд▓рд┐рдЦреЗрдВрдЧреЗред

рдХрд┐рд╕реА рднреА рд╕реБрд░рдХреНрд╖рд╛ рдХреА рдХреЛрдИ рдзрд╛рд░рдгрд╛ рдирд╣реАрдВ рд╣реИ, рд╕рд╛рде рд╣реА рддреНрд░реБрдЯрд┐ рдЬрд╛рдВрдЪ рдФрд░ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЯрд░реНрдорд┐рдирд▓ рдХреА рд╕рд╣реА рд╕рдорд╛рдкреНрддрд┐ (!) , рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЦреБрдж рд╕реЛрдЪрдирд╛ рд╣реЛрдЧрд╛;)ред

Shell.php рдлрд╝рд╛рдЗрд▓



рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛

рд╣рдореЗрдВ рдХрд┐рд╕реА рддрд░рд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реЗ рдЗрдирдкреБрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдлреАрдлреЛ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ:

 <?php $temp_fifo_file = '/tmp/dolphin-pipe-'.uniqid('dolph'); if (!posix_mkfifo($temp_fifo_file, 0600)) { echo "Fatal error: Cannot create fifo file: something wrong with the system.\n"; exit(1); } function deleteTempFifo() { unlink($GLOBALS['temp_fifo']); } register_shutdown_function('deleteTempFifo'); $cmdfp = fopen($temp_fifo_file, 'r+'); stream_set_blocking($cmdfp, 0); 

рдЯрд░реНрдорд┐рдирд▓ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рд╕реЗрдЯ рдХрд░рдирд╛

JSLinux vt100 рдПрдореБрд▓реЗрд╢рди рдореЛрдб рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд╣рдо рднреА рдРрд╕рд╛ рд╣реА рдХрд░реЗрдВрдЧреЗ :)

 putenv('TERM=vt100'); $cols = 80; //    ,  - $rows = 24; 

рдмрд╛рд╢ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрдЬреНрдЮрд╛

рдореВрд▓ рд░реВрдк рд╕реЗ, рд╣рдо рдмрд╕ " bash -i " рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛ (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ " sh -i " рдХрд╛рдо рдХрд░реЗрдЧрд╛), рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рднреА рдмреЗрд╣рддрд░, рдЕрдЧрд░ рд╣рдо рдЫрджреНрдо рдЯрд░реНрдорд┐рдирд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЕрдзрд┐рдХ "рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ" рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдВрдЧреЗ " ред рдЙрд╕реА рд╕рдордп, рд╣рдо рдЕрдкрдиреЗ bashrc рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдПрдХ рд░рдВрдЧ рдкреНрд░реЙрдореНрдкреНрдЯ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВрдЧреЗ :)ред

 chdir(dirname(__FILE__)); $cmd = "bash --rcfile ./bashrc -i 2>&1"; //         (pt.c,   ) //    ,       if (!file_exists('pt')) { system('cc -D__'.strtoupper(trim(`uname`)).'__ -o pt pt.c -lutil 2>&1', $retval); if ($retval) echo('<b>Warning:</b> Cannot compile pseudotty helper'); } clearstatcache(); if (file_exists('pt')) $cmd = "./pt $rows $cols $cmd"; $pp = proc_open($cmd, array(array('pipe','r'), array('pipe', 'w')), $pipes); stream_set_blocking($pipes[0], 0); stream_set_blocking($pipes[1], 0); ?> 

рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдХрдорд╛рдВрдб рднреЗрдЬрдирд╛

рд╣рдо рдкреНрд░рддрд┐ рдЪрд░рд┐рддреНрд░ (рдпрд╛ рдЕрдзрд┐рдХ рд╡рд░реНрдг рдпрджрд┐ рд╕рд░реНрд╡рд░ "рд╕рдордп рдирд╣реАрдВ рд╣реИ") рдПрдХ HTTP рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВрдЧреЗред рд╣рд╛рдВ, рдпрд╣ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдПрдХ рдЕрдиреБрдЪрд┐рдд рдЕрдкрд╢рд┐рд╖реНрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╕рдм рдХреБрдЫ рд╡реЗрдм рд╕реЙрдХреЗрдЯреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореЗрд░реА рдпреЛрдЬрдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИ :)ред

 <html><head><title>Terminal</title></head><body> <script> var pipeName = <?=json_encode($temp_fifo_file)?>, pending_str = '', processing = false; var sendCmdInterv = setInterval(function() { if (processing) return; if (pending_str.length) { processing = true; var previous_str = pending_str; pending_str = ''; var http = new XMLHttpRequest(); http.open("GET", "send-cmd.php?pipe=" + pipeName + "&cmd=" + encodeURIComponent(previous_str), true); http.onreadystatechange = function() { if (http.readyState == 4 && http.status == 200) { processing = false; pending_str = ''; } else { pending_str = previous_str + pending_str; } }; http.send(null); } }, 16); function send_cmd(val) { pending_str += val; } </script> 


рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЯрд░реНрдорд┐рдирд▓ рдПрдореБрд▓реЗрдЯрд░

JSLinux рдХреЗ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЙрдкрдпреЛрдЧреА рднрд╛рдЧ рд╣реИрдВ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рдПрдХ рдЯрд░реНрдорд┐рдирд▓ рдПрдореБрд▓реЗрдЯрд░ рд╣реИред рд▓реЗрдЦрдХ рдЕрдкрдиреЗ рдЬреНрдЮрд╛рди рдХреЗ рдмрд┐рдирд╛ рд╢рдмреНрдж .js рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╡рд┐рддрд░рдг рдФрд░ рд╕рдВрд╢реЛрдзрди рдХреЛ рдордирд╛ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╣рдо рд╕рд┐рд░реНрдл рдЙрд╕рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░реЗрдВрдЧреЗ :) рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрд╕реА рд░реВрдк рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВред

 <style> .term { font-family: monaco,courier,fixed,monospace,swiss,sans-serif; font-size: 13px; line-height: 16px; color: #f0f0f0; background: #000000; } tr { height: 16px; } .termReverse { color: #000000; background: #00ff00; } </style> <script src="http://bellard.org/jslinux/utils.js"></script> <script src="http://bellard.org/jslinux/term.js"></script> <script>var term = new Term(<?=$cols?>, <?=$rows?>, send_cmd); term.open();</script> 

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рдкрдврд╝рдирд╛ рдФрд░ рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛

рд╣рдо рдЕрдкрдиреЗ FIFO рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рдкрдврд╝рддреЗ рд╣реИрдВ, рдЗрд╕реА рдкрд╛рдЗрдк рд╕реЗ рд╣рдорд╛рд░реЗ рдХрдорд╛рдВрдб рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ, рд╕рдм рдХреБрдЫ рдЧреИрд░-рдЕрд╡рд░реЛрдзрдХ рдореЛрдб рдореЗрдВ рд╣реИ, рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдПред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдЫреЛрдЯреА рдмреИрд╕рд╛рдЦреА рдХреЗ рд░реВрдк рдореЗрдВ, "\ n" рдХреЛ "\ r \ n" рд╕реЗ рдмрджрд▓реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЯрд░реНрдо .js рд╕реАрд░рд┐рдпрд▓ рдкреЛрд░реНрдЯ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рддрд╛ рд╣реИ, рди рдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ "рд░реЙ" рдЖрдЙрдЯрдкреБрдЯ рдХреЛ;)ред

 <?php echo "<!-- ".str_repeat('-', 4096)." -->\n"; flush(); while (!feof($pipes[1])) { $ln = fgets($pipes[1], 4096); if ($ln !== false) { $ln = str_replace("\n", "\r\n", $ln); echo '<script>term.write('.json_encode($ln).');</script>'; flush(); continue; } $inp_ln = fgets($cmdfp, 4096); if ($inp_ln !== false) { // ensure that command is fully written by setting blocking to 1 stream_set_blocking($pipes[0], 1); fwrite($pipes[0], $inp_ln); stream_set_blocking($pipes[0], 0); } usleep(20000); } proc_close($pp); ?> 

рд╣рдо рдПрдХ рдирд┐рдХрд╛рд╕ рдХреЗ рдмрд╛рдж рдЖрджреЗрд╢реЛрдВ рдХрд╛ рд╕реНрдкрд╖реНрдЯ рд╕реНрд╡рд╛рдЧрдд рдХрд░рддреЗ рд╣реИрдВ

рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреВрд░реА рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд┐рд╕реА рд╡реНрдпрдХреНрддрд┐ рдиреЗ Ctrl + D рджрдмрд╛рдпрд╛ рдпрд╛ "рдирд┐рдХрд╛рд╕" рджрд░реНрдЬ рдХрд┐рдпрд╛), рдЖрдкрдХреЛ рд╕рд░реНрд╡рд░ рдкрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рднреЗрдЬрдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдИ рдФрд░ рдирд╣реАрдВ рд╣реИ :)ред
 <script>clearInterval(sendCmdInterv);</script> </body> </html> 


Send-cmd.php рдлрд╝рд╛рдЗрд▓


рдЬрд┐рд╕ рдлрд╛рдЗрд▓ рдХреЛ рд╣рдо рдХрдорд╛рдВрдб рднреЗрдЬрддреЗ рд╣реИрдВ, рдЙрд╕реЗ рд╕реЗрдВрдб- cmd.php рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдирд┐рдореНрди рд╢рд╛рдорд┐рд▓ рд╣реЛрддреЗ рд╣реИрдВ (рд╣рд╛рдБ, рдЗрдирдкреБрдЯ рдкрд░ рдХреЛрдИ рдЬрд╛рдВрдЪ рдирд╣реАрдВ рд╣реИ :)):

 <?php $fp = fopen($_GET['pipe'], 'r+'); fwrite($fp, $_GET['cmd']); fclose($fp); 


Bashrc рдлрд╝рд╛рдЗрд▓


рдпрд╣рд╛рдБ рдореИрдВ рдХрд┐рд╕ bashrc рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдБ:

 export PS1='\[\033[01;33m\]\u\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ' export PS2='> ' export PS4='+ ' export LANG=en_US.UTF-8 echo Welcome to simple terminal emulator'!' echo Scroll up and down using Ctrl-Up, Ctrl-Down, Ctrl-PageUp and Ctrl-PageDown. echo Output handling is based on JSLinux term.js library. Enjoy'!' 


Pt.c рдлрд╝рд╛рдЗрд▓


рдПрдХ рдЫрджреНрдо рдЯрд░реНрдорд┐рдирд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЕрдЪреНрдЫреА рдЙрдореНрдореАрдж рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ рдЬреЛ рд▓рдЧрднрдЧ рд╡рд╣реА рдХрд░рддрд╛ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдПред рдлрд┐рд░ рднреА, рдореБрдЭреЗ рдЕрдкрдиреА рдЦреБрдж рдХреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд▓рд┐рдЦрдирд╛ рджрд┐рд▓рдЪрд╕реНрдк рд▓рдЧрд╛, рдЬреЛ рдмрд╕ рдЯрд░реНрдорд┐рдирд▓ рдХреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрдХрд╛рд░реЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдЧрд╛ рдФрд░ рд╕реНрдЯрдбрдЖрдЙрдЯ рдкрд░ рд╕рдм рдХреБрдЫ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ рдФрд░ рд╕реНрдЯрдб рдкрд░ рдЗрдирдкреБрдЯ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдЧрд╛:

 #include <unistd.h> #include <sys/select.h> #include <stdio.h> #ifdef __LINUX__ #include <pty.h> #else #include <util.h> #endif static void set_fds(fd_set *reads, int pttyno) { FD_ZERO(reads); FD_SET(0, reads); FD_SET(pttyno, reads); } int main(int argc, char *argv[]) { char buf[1024]; int pttyno, n = 0; int pid; struct winsize winsz; if (argc < 3) { fprintf(stderr, "Usage: %s <rows> <cols> <cmd> [args]\n", argv[0]); return 1; } winsz.ws_row = atoi(argv[1]); winsz.ws_col = atoi(argv[2]); winsz.ws_xpixel = winsz.ws_col * 14; winsz.ws_ypixel = winsz.ws_row * 14; pid = forkpty(&pttyno, NULL, NULL, &winsz); if (pid < 0) { perror("Cannot forkpty"); return 1; } else if (pid == 0) { execvp(argv[3], argv + 3); perror("Cannot exec bash"); } fd_set reads; set_fds(&reads, pttyno); while (select(pttyno + 1, &reads, NULL, NULL, NULL)) { if (FD_ISSET(0, &reads)) { n = read(0, buf, sizeof buf); if (n == 0) { return 0; } else if (n < 0) { perror("Could not read from stdin"); return 1; } write(pttyno, buf, n); } if (FD_ISSET(pttyno, &reads)) { n = read(pttyno, buf, sizeof buf); if (n == 0) { return 0; } else if (n < 0) { perror("Cannot read from ptty"); return 1; } write(1, buf, n); } set_fds(&reads, pttyno); } int statloc; wait(&statloc); return 0; } 


рдХрд╛рд░реНрдп рдкреНрд░рджрд░реНрд╢рди


рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореИрдВ рдЖрдкрдХреЛ рдПрдХ рдХрд╛рд░реНрдпрд╢реАрд▓ рдбреЗрдореЛ рдХреЗ рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рд░реНрд╡рд░ рдирд╣реАрдВ рд╣реИ рдЬреЛ рдореБрдЭреЗ рдмреБрд░рд╛ рдирд╣реАрдВ рд▓рдЧрддрд╛;) рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореИрдВрдиреЗ рдПрдХ рдЫреЛрдЯрд╛ рд╡реАрдбрд┐рдпреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд┐рдпрд╛ рдЬреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:



рд╕рднреА рдПрдХ рд╕рд╛рде


рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд╕рднреА рд╕реНрд░реЛрдд рдХреЛрдб рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдЖрдк рдЖрд▓рд╕реА рд╣реИрдВ, рддреЛ рдореИрдВрдиреЗ рд▓реЛрдЧреЛрдВ рдкрд░ рдЙрдкрдпреБрдХреНрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдЧреНрд░рд╣ рд░рдЦрд╛ред

рдпреБрдкреАрдбреА:
рдпрджрд┐ pt.c рдкреНрд░реЛрдЧреНрд░рд╛рдо FreeBSD рдХреЗ рддрд╣рдд рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдлрд╝рд╛рдЗрд▓ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реЗрдбрд░ рдлрд╛рдЗрд▓реЗрдВ рдЬреЛрдбрд╝реЗрдВ (рдФрд░ #include <util.h> рдЗрд╕реЗ рд╣рдЯрд╛ рджреЗрдВ):
 #include <sys/types.h> #include <sys/ioctl.h> #include <termios.h> #include <libutil.h> 

Source: https://habr.com/ru/post/In139878/


All Articles