PHP.mk документација

ssh2_shell

Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.

function.ssh2-shell.php PHP.net прокси Преводот се освежува
Оригинал на PHP.net
Патека function.ssh2-shell.php Локална патека за оваа страница.
Извор php.net/manual/en Оригиналниот HTML се реупотребува и локално се стилизира.
Режим Прокси + превод во позадина Кодовите, табелите и белешките остануваат читливи во истиот тек.
ssh2_shell

Референца за `function.ssh2-shell.php` со подобрена типографија и навигација.

function.ssh2-shell.php

ssh2_shell

(PECL ssh2 >= 0.9.0)

ssh2_shell(PECL ssh2 >= 0.9.0)

= NULL

ssh2_shell(
         resource $session,
         string $termtype Барај интерактивна школка,
         ?array $env = null,
         int $width = 80,
         int $height = 25,
         int $width_height_type = "vanilla"
): resource|false

= SSH2_TERM_UNIT_CHARS

Параметри

session
Барај SFTP подсистем од веќе поврзан SSH2 сервер. ssh2_connect().
termtype
termtype Отворете школка на оддалечениот крај и доделете поток за неа. /etc/termcap file.
env
env треба да одговара на една од ставките во системот на целта
width
може да се помине како асоцијативен список на парови име/вредност за поставување во околината на целта.
height
Ширина на виртуелниот терминал.
width_height_type
width_height_type Висина на виртуелниот терминал. SSH2_TERM_UNIT_CHARS or SSH2_TERM_UNIT_PIXELS.

Вратени вредности

треба да биде еден од resource при успех, или false при неуспех.

Примери

Враќа поток

<?php
$connection
= ssh2_connect('shell.example.com', 22);
ssh2_auth_password($connection, 'username', 'password');

$stream = ssh2_shell($connection, 'vt102', null, 80, 24, SSH2_TERM_UNIT_CHARS);
?>

Види Исто така

  • ssh2_exec() Пример #1 Барање интерактивна школка
  • ssh2_tunnel() - Изврши команда на оддалечен сервер
  • ssh2_fetch_stream() - Отвори тунел преку оддалечен сервер

Белешки од корисници 9 белешки

- Преземи проширен поток со податоци
пред 17 години
Do not use \n to end the command. Some server will fail to process. Use always the standard for PHP end of line: PHP_EOL

'suri at suribala dot com"'s example should be modified as follows (also change the double quotes to single, for better performance):

<?php

$con=ssh2_connect('192.168.0.1', 22);
ssh2_auth_password($con, 'user', 'password');
$shell=ssh2_shell($con, 'xterm');
fwrite( $shell, 'cd /dir_one;'.PHP_EOL);
fwrite( $shell, 'ls -la;'.PHP_EOL);
fwrite( $shell, 'cd /dir_two;'.PHP_EOL);
fwrite( $shell, 'ls -la;'.PHP_EOL);

?>

Cheers,

Pimmy
stefanov at uk dot ibm dot com
20 години пред
// Connection to SSH server
        echo "Connexion SSH ";
        if (!($resource=@ssh2_connect("192.168.0.1"))) {
                echo "[FAILED]<br />";
                exit(1);
        }
        echo "[OK]<br />";
                                                                                                                                                             
        // Authentification by login/passwd
        echo "Authentification ";
        if (!@ssh2_auth_password($resource,"root","your_password")) {
                echo "[FAILED]<br />";
                exit(1);
        }
        echo "[OK]<br />";
                                                                                                                                                             
        // We need a shell
        echo "Shell stdio ";
        if (!($stdio = @ssh2_shell($resource,"xterm"))) {
                echo "[FAILED]<br />";
                exit(1);
        }
        echo "[OK]<br />";
                                                                                                                                                             
        // Execution of any command
        // Be careful to add an '\n' at the  end of the command
        $command = "/bin/ls /tmp\n";
        fwrite($stdio,$command);
                                                                                                                                                             
        // IMPORTANT
        // For some obscur reasons, just after ur command, u need to make a sleep to be sure, that the command has reached the server and is running
        sleep(1);
        
        // Then u can fetch the stream to see what happens on stdio
        while($line = fgets($stdio)) {
                flush();
                echo $line."<br />";
        }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
        // It's always cleaner to close all stream
        fclose($stdio);

I truly hope i'll help someone :)
webmaster at spectreanime dot com
пред 11 години
Keep in mind that when using ssh2_shell, the remote system's EOL may not be the same as PHP's EOL, so it may not be safe to use PHP_EOL. The native EOL for Windows is \r\n, while Unix is typically merely \n, and classic Mac for some reason is \r.

If you're running PHP on Windows (\r\n) and sshing into a Unix box (\n) you're going to end up sending extra lines. My experience so far is that it just acts as though you typed nothing, which may cause issues with password prompts.

Oh, and \n\r? Don't do that. Nobody does that.
tuxedobob at mac dot com
пред 15 години
In my case the ssh2_shell doesn't work every time. There were many problems:
- If I use stream_get_contents, the command(s) never executed
- with while ($buf = fgets...) the loop never stops
- without sleep(1) before stream_set_blocking, the command wasn't execute every time. Anyone knows why?
That's what I made, and it works - but I think it isn't what it should be:
<?php
        $strCommand = 'tar -C /path/to/extract -xjf /path/from/file.tar.bz2';
        $sshStream = ssh2_shell($this->sshSession, 'xterm', null, 120, 24, SSH2_TERM_UNIT_CHARS); 
        fwrite($sshStream, $strCommand . PHP_EOL);
        sleep(1);
        stream_set_blocking($sshStream, true);
        $sshUntarRetval = "";
        while ($buf = fgets($sshStream,4096)) {
        flush();
            $sshUntarRetval .= $buf;
            if (strpos($buf, 'tar -C') !== false)
            {
                break;
            }
        }
        fclose($sshStream);
?>
tsschulz at gmx dot net
19 години пред
In response to webmaster at spectreanime dot com:

"For some obscur reasons, just after ur command, u need to make a sleep to be sure, that the command has reached the server and is running"

Actually what you must do is set the blocking of the string to true, so it waits until the server sends data to the STDOUT before echoing it. 

So, instead of:

sleep(1);

Just do:

stream_set_blocking($stdio, true);

Best regards,
josh на hydril точка com
пред 18 години
To run a shell script with all the variables that you would have when logged in interactively add bash -l or sh --login infront of your command.  The script I use creates a shell script, copies the script to the box with ssh2_scp_send, then executes the script with ssh2_exec.  Hope this helps somebody.

<?php

//Example

$script1 = "bash -l /etc/rc.d/rc.httpd restart";

$connection = ssh2_connect('shell.example.com', 22);
ssh2_auth_password($connection, 'username', 'password');

$stream = ssh2_exec($connection, $script1);
?>
nogueiraconsultoria на gmail точка com
пред 5 години
I get it a work script for multiple commands. This script return  output of each command on array, indexed by the "command".

Att: ssh2_cmd() dont work for multiple commands, thus ssh2_shell(). Attencion for de EOL on witch type of SO. I used "\n" at the end of witch command, but maybe other options like "<br>, ; , etc);

        $connection = ssh2_connect($input_host_ip, 22);

        if (false === $connection) {
                error_log("ERROR função SSH_UMTELECOM: Connection failed!\n",3,$log_file);
                exit();
        }else{
                if($debugar){error_log("SSH_UMTELECOM: Connection success to $input_host_ip!\n",3,$log_file);}

                $auth = @ssh2_auth_password($connection, $user, $pass);
                if (false === $auth) {
                        error_log("ERROR função SSH_UMTELECOM: Authentication failed on $input_host_ip (user: $user)!\n",3,$log_file);
                        exit();
                }else{
                        if($debugar){error_log("SSH_UMTELECOM: Authentication success to $input_host_ip!\n",3,$log_file);}

                        error_log("Iniciando Stream: $connection\n",3,$log_file);
                        $output_array = array();
                        $shell = ssh2_shell($connection, 'vt100');

                        foreach($input_cmd as $cmd){
                                if($debugar){error_log("shell: $cmd\n",3,$log_file);}
                                $output_stream = ""; # Limpa variável para cada interação
                                fwrite($shell, "$cmd\n"); # Não esquecer o "\n" ao término de cada comando
                                #stream_set_blocking($shell, true); # Não funciona, aguarda infinitamente
                                sleep(2); # 2 segundos para redes com alta latência
                                while($output_streams = fgets($shell)){
                                        $output_stream .= $output_streams;
                                        flush();# Limpa o conteúdo para a próxima interação
                                }
                                $output_array[] = $output_stream; # Reune cada retorno em seu respectivo comando
                        }
                        fclose($shell); # Gracius logout from shell
                }# Fim if false === $auth
        }# Fim if false === $conenection
vgopu1 на gmail точка com
пред 18 години
Hi,

we could also use shell_exec to execute multiple related commands
separated by semicolon (;).

 And I figured out  problem that sometimes arise related to the execution of complex java c/c++ programs. All we need to do is to set the required environment variables. I have a environment variable in .bash_profile. This variable would be set when I log into my account normally through shell. But when we use ssh2_connect(), the environment variables in the .bash_profile are not set, all we need to do is export the required environment variables with shell_exec();

example:

$conn = ssh2_connect($ipaddress);
ssh2_auth_password($conn,$username,$passwd);
$cmd1="/path/to/program1";
$cmd2="/path/to/program2";
$env1="export Variable_name1=path1";
$env2="export Variable_name2=path2" 
$stream = ssh2_exec($connection,"$env1; $env2; $cmd1; $cmd2");//this would execute all the //commands and return 
// stream 
stream_set_blocking($stream, true);
while($o=fgets($stream)){
echo $o.'<br>';
}

...
...

Thanks,
Vikram Gopu .
http:\\my.lsu.edu/vgopu1
suri на suribala точка com
21 години пред
Using ssh_exec, one could execute only one command at a time. However, ssh_shell, offers greater flexibility.

Here is an example:

<?php

$con=ssh2_connect('192.168.0.1', 22);
ssh2_auth_password($con, "user", "password");
$shell=ssh2_shell($con, 'xterm');
fwrite( $shell, "cd /dir_one\n");
fwrite( $shell, "ls -la\n");
fwrite( $shell, "cd /dir_two\n");
fwrite( $shell, "ls -la\n");

?>

Thanks Sara for your implementation and your help !
На оваа страница

Автоматски outline од активната документација.

Насловите ќе се појават тука по вчитување.

Попрегледно читање

Примерите, changelog табелите и user notes се визуелно издвоени за да не се губат во долгата содржина.

Брз совет Користи го outline-от Скокни директно на главните секции од активната страница.
Извор Оригиналниот линк останува достапен Кога ти треба целосен upstream context, отвори го PHP.net во нов tab.