рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧреЛрдВ рдиреЗ рдкреАрдПрдЪрдкреА рдореЗрдВ рдЕрдкрдиреЗ рдЯрд░реНрдорд┐рдирд▓ рдПрдореБрд▓реЗрдЯрд░ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛ рдерд╛, рдФрд░ рдЖрдорддреМрд░ рдкрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреИрд╕реЗ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдкрд░ рдмрд╕реЗ рдереЗ:
<?php echo '<form><input name="cmd" /></form>'; if(isset($_GET['cmd'])) system($_GET['cmd']);
рдмреЗрд╢рдХ, рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдорд╛рдзрд╛рди рд╕реЗ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдПрдХ рдкреВрд░рд╛ рд╕реЗрдЯ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рд╣реАрди рдпрд╣ рд╣реИ рдХрд┐ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕реНрдХреНрд░реАрди рдкрд░ рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИред рдмрд╣реБрдд рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЪреАрдЬреЗрдВ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, vi рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдХреЗрд╡рд▓ рдХрдорд╛рдВрдб рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ "рдирд┐рд▓рдВрдмрд┐рдд" рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЖрдкрдХреЛ рдПрдХ рдирдпрд╛ рдХрдВрд╕реЛрд▓ рдЦреЛрд▓рдирд╛ рд╣реЛрдЧрд╛ рдФрд░
killall vi
рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред рдФрд░ рдЬреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рд╡рд╣ ssh рдпрд╛ sudo рдХрдорд╛рдВрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЯрд░реНрдорд┐рдирд▓ рд╕реЗ рд╕реАрдзреЗ рдкрд╛рд╕рд╡рд░реНрдб рдкрдврд╝рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдореИрдВ рдПрдХ рдРрд╕рд╛ рд░рд╛рд╕реНрддрд╛ рджрд┐рдЦрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЖрдк рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╣рдо PHP рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЯрд░реНрдорд┐рдирд▓ рдПрдореБрд▓реЗрдЯрд░ рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ
рд╣рдорд╛рд░реЗ рдЯрд░реНрдорд┐рдирд▓ рдПрдореБрд▓реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:
- PHP 5.2+ (рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде - PHP 4.3+)
- рд╕рдорд╛рд░реЛрд╣ рдХрд╛рд░реНрдп рдкреНрд░рдгрд╛рд▓реА () рдФрд░ proc_open ()
- рдлрдВрдХреНрд╢рдирд┐рдВрдЧ рдлрдВрдХреНрд╢рди рдлреНрд▓рд╢ () ( рдлреНрд▓рд╢) рдиреЗрдЧрдиреЗрдХреНрд╕ рдХреЗ рд▓рд┐рдП
- рд╢рдмреНрджред js рдФрд░ utils.js JSLinux рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ
- рд▓рд┐рдирдХреНрд╕, рдореИрдХ рдУрдПрд╕ рдПрдХреНрд╕ рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдкрд░ (рдкрд░ * рдмреАрдПрд╕рдбреА рдиреЗ рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдХреА, рд╕реБрдзрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ)
рд╢рд╛рдпрдж, 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;
рдмрд╛рд╢ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрдЬреНрдЮрд╛
рдореВрд▓ рд░реВрдк рд╕реЗ, рд╣рдо рдмрд╕ "
bash -i
" рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛ (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ "
sh -i
" рдХрд╛рдо рдХрд░реЗрдЧрд╛), рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рднреА рдмреЗрд╣рддрд░, рдЕрдЧрд░ рд╣рдо рдЫрджреНрдо рдЯрд░реНрдорд┐рдирд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЕрдзрд┐рдХ "рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ" рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░реЗрдВрдЧреЗ " ред рдЙрд╕реА рд╕рдордп, рд╣рдо рдЕрдкрдиреЗ bashrc рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдПрдХ рд░рдВрдЧ рдкреНрд░реЙрдореНрдкреНрдЯ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВрдЧреЗ :)ред
chdir(dirname(__FILE__)); $cmd = "bash --rcfile ./bashrc -i 2>&1";
рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдХрдорд╛рдВрдб рднреЗрдЬрдирд╛
рд╣рдо рдкреНрд░рддрд┐ рдЪрд░рд┐рддреНрд░ (рдпрд╛ рдЕрдзрд┐рдХ рд╡рд░реНрдг рдпрджрд┐ рд╕рд░реНрд╡рд░ "рд╕рдордп рдирд╣реАрдВ рд╣реИ") рдПрдХ 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) {
рд╣рдо рдПрдХ рдирд┐рдХрд╛рд╕ рдХреЗ рдмрд╛рдж рдЖрджреЗрд╢реЛрдВ рдХрд╛ рд╕реНрдкрд╖реНрдЯ рд╕реНрд╡рд╛рдЧрдд рдХрд░рддреЗ рд╣реИрдВ
рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреВрд░реА рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд┐рд╕реА рд╡реНрдпрдХреНрддрд┐ рдиреЗ 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>