我正在尝试基于连接到我的vps的ssh2创建一些东西,然后创建一些文件并使用exec命令运行它们。
我已经完成了一个更大的部分,即创建一个目录将文件从一个目录移动到另一个目录,现在我需要做这样的事情
以前创建的cd目录
nohup ./samp03srv
但我怎么能用php做到这一点?
这是我到目前为止所得到的
$ssh = new SSH2($request->ip);
if (!$ssh->login("root", "hpk2o321"))
{
return back()->withErrors("Authentication failed! Please check your credentials!");
}
$randomNum = substr(str_shuffle("0123456789abcdefghijklmnopqrstvwxyz"), 0, 11);
$src = $request->path;
$dest = "/home/servers/$randomNum";
echo $ssh->exec("cp -r $src $dest");
echo $ssh->exec('cd '.$dest.' &');
echo $ssh->exec('chmod +x samp-npc samp03svr announce &');
echo $ssh->exec('killall samp03svr &');
echo $ssh->exec('nohup ./samp03svr &');
echo $ssh->exec('pwd -P');
$ssh->disconnect();
如果您需要更多信息,请询问!
答案 0 :(得分:0)
从你的代码:
echo $ssh->exec("cp -r $src $dest");
echo $ssh->exec('cd '.$dest.' &');
echo $ssh->exec('chmod +x samp-npc samp03svr announce &');
echo $ssh->exec('killall samp03svr &');
echo $ssh->exec('nohup ./samp03svr &');
尝试$ssh->exec('cd ' . $dest . '; chmod +x samp-npc samp03svr announce; killall samp03svr; nohup ./samp03svr &');
你的连续执行官的问题在于cd
不会持续存在。考虑exec的一种好方法(尤其是当它不使用PTY时)是你在框中运行命令,然后关闭SSH会话。如果你这样做,你不会期望cd
从一个会话持续到下一个会话,是吗?
从技术上讲,这不是phpseclib正在做的事情。 phpseclib正在调用SSH规范中描述的exec命令。打开一个通道,发送命令,返回输出,然后SSH服务器本身关闭通道,有效地结束会话。 SSH连接保持打开状态,因此您不需要再次进行密钥交换或身份验证,但通道已关闭。
PuTTY和OpenSSH的工作方式是他们使用我认为最好被理解为交互模式的模式。 exec不是互动的。您可以使用$ssh->read('#prompt#'); $ssh->write("cp -r $src $dest");
等在phpseclib中启用交互模式。
http://phpseclib.sourceforge.net/ssh/examples.html#chdir详细说明。