我使用PHP编写常见服务器管理任务的快捷方式(我使用deployer.org,但这不重要)。我想在SSH连接到服务器后添加一个用于启动交互式bash提示的任务。例如,你可以运行" ./ dep ssh" (其中" dep"是PHP脚本),这与运行例如效果相同" ssh user @ server"从终端。有没有办法在PHP中执行此操作?对于上下文,我有大约5台服务器,我经常想要SSH,或读取日志,或复制文件等。所以我想要快捷方式。
我能够得到的最接近的是:
$ph = popen("bash","w");
while(($line = fgets(STDIN)) !== false){
fputs($ph,$line);
}
pclose($ph);
这允许您向bash发送命令以及从bash发送命令但是您没有看到正常的bash提示或获取标签完成。我需要这样的东西,但所有正常的bash功能都可以正常工作。
答案 0 :(得分:1)
如果您只是想在网络浏览器中使用SSH,那么您可能正在寻找以下产品之一:
您可能希望看一下is a link。
答案 1 :(得分:0)
#!/usr/bin/php
# This doesn't work, but it might lead you in the right direction.
<?
$ph = popen("bash","w");
function getCharacter() {
$cmd = '
read -n 1 char;
if [ "$char"==" " ]; then
echo space
elif [ "$char"=="\n" ]; then
echo newline
else
echo "$char"
fi
';
return trim(shell_exec($cmd));
}
$command = "";
while (false !== ($char = getCharacter())) {
if ($char === "space") {
$command .= ' ';
} elseif ($char === "newline") {
fputs($ph, $command);
$command = "";
} elseif ($char === "\t") {
# Do something fancy with the `compgen` bash utility.
echo shell_exec("compgen -d $command");
} else {
$command .= $char;
}
}
不幸的是,它已经迟到了所以我无法完成它= D.这里的主要问题是读取输入(fgets
仅在用户输入换行符后发生,因此无法检测&#34; \ t&#34;)。我尝试用read
伪造它,但它确实是错误的。
fgetc
也无法工作,这需要完成用户输入。
我的下一步是研究tty
的工作方式,并尝试以这种方式破解它。但是,当然,您仍然需要做很多工作才能尝试使compgen
的输出相关。这将涉及确定要发送给compgen的参数和选项(即,用户输入命令或文件名)。
答案 2 :(得分:-1)
这是您连接和执行命令的方法:
<?php
/* Notify the user if the server terminates the connection */
function my_ssh_disconnect($reason, $message, $language) {
printf("Server disconnected with reason code [%d] and message: %s\n",
$reason, $message);
}
public function my_exec_cmd($connection, $cmd) {
if (!($stream = ssh2_exec($connection, $cmd))) {
throw new Exception('SSH command failed');
}
stream_set_blocking($stream, true);
$data = "";
while ($buf = fread($stream, 4096)) {
$data .= $buf;
}
fclose($stream);
return $data;
}
$methods = array(
'kex' => 'diffie-hellman-group1-sha1',
'client_to_server' => array(
'crypt' => '3des-cbc',
'comp' => 'none'),
'server_to_client' => array(
'crypt' => 'aes256-cbc,aes192-cbc,aes128-cbc',
'comp' => 'none'));
$callbacks = array('disconnect' => 'my_ssh_disconnect');
$connection = ssh2_connect('shell.example.com', 22, $methods, $callbacks);
if (!$connection){
die('Connection failed');
}else{
my_exec_cmd($connection, "ls -la");
}
?>