php ssh2 交换机_PHP ssh2_shell 用法 手册 | 示例代码

tuxedobob at mac dot com

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 rn, while Unix is typically merely n, and classic Mac for some reason is r.

If you're running PHP on Windows (rn) 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 nr? Don't do that. Nobody does that.

josh at hydril dot com

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.

galvao at galvao dot eti dot br

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,

stefanov at uk dot ibm dot com

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):

$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

vgopu1 at gmail dot com

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.'
';

}

...

...

Thanks,

Vikram Gopu .

http:\my.lsu.edu/vgopu1

tsschulz at gmx dot net

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:

$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);?>

webmaster at spectreanime dot com

// Connection to SSH server

echo "Connexion SSH ";

if (!($resource=@ssh2_connect("192.168.0.1"))) {

echo "[FAILED]
";

exit(1);

}

echo "[OK]
";

// Authentification by login/passwd

echo "Authentification ";

if (!@ssh2_auth_password($resource,"root","your_password")) {

echo "[FAILED]
";

exit(1);

}

echo "[OK]
";

// We need a shell

echo "Shell stdio ";

if (!($stdio = @ssh2_shell($resource,"xterm"))) {

echo "[FAILED]
";

exit(1);

}

echo "[OK]
";

// Execution of any command

// Be careful to add an 'n' at the  end of the command

$command = "/bin/ls /tmpn";

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."
";

}

// It's always cleaner to close all stream

fclose($stdio);

I truly hope i'll help someone :)

suri at suribala dot com

Using ssh_exec, one could execute only one command at a time. However, ssh_shell, offers greater flexibility.

Here is an example:

$con=ssh2_connect('192.168.0.1',22);ssh2_auth_password($con,"user","password");$shell=ssh2_shell($con,'xterm');fwrite($shell,"cd /dir_onen");fwrite($shell,"ls -lan");fwrite($shell,"cd /dir_twon");fwrite($shell,"ls -lan");?>

Thanks Sara for your implementation and your help !

johnes at netsite dot com dot br

Instead of using sleep(1) try using usleep(350000). If not, you will need to spend much time unnecessary. In my scripts, I tried to use usleep(250000), but it's too short and brought some problems. usleep(300000) worked, but only to garantee use 350000. ;)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值