【发布时间】:2021-04-24 09:46:52
【问题描述】:
总结
我创建了一个使用 phpseclib3 库通过 SFTP 上传的 shell 脚本。正在执行 shell 脚本,但在使用以下 PHP 代码运行脚本时,没有安装所有 apt 包。它安装了一些软件包,但在某个地方挂断了。但是,如果我使用 FileZilla 使用同一用户上传文件,然后登录以执行相同的脚本,则所有软件包都已正确安装。输出也没有显示任何错误。
这几乎就像包都试图创建一次,这会锁定包并导致我找不到的错误。
我尝试过的事情
- 让脚本静默运行
- 确保 PHP 没有超时
- 使用了不同的 SSH 作曲家包
- 将 apt 安装拆分为单个项目,而不是一个长列表
- 在脚本顶部添加和删除
sudo true - 尝试多次重新运行
apt install - 使用
apt-get而不是apt
PHP 代码
$ssh = new SSH2($ip_address);
if (!$ssh->login('login', $key)) {
// error handling
}
$ssh->setTimeout(0);
$ssh->setKeepAlive(10);
$process[] = $ssh->exec('chmod +x install.sh; sh install.sh;');
外壳示例
#!/bin/bash
sudo true
sudo dpkg --add-architecture i386
sudo apt update
sudo apt -y install curl wget file tar bzip2 gzip unzip bsdmainutils python util-linux ca-certificates binutils bc jq tmux netcat lib32gcc1 lib32stdc++6
echo steam steam/license note '' | sudo debconf-set-selections && echo steam steam/question select 'I AGREE' | sudo debconf-set-selections && sudo apt -y install steamcmd
wget -O linuxgsm.sh https://linuxgsm.sh && chmod +x linuxgsm.sh && bash linuxgsm.sh squadserver
yes Y | ./squadserver install
touch done.txt
错误日志
sudo true
+ sudo dpkg --add-architecture i386
+ sudo apt update
WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
Hit:1 http://security.ubuntu.com/ubuntu bionic-security InRelease
Get:2 http://mirrors.digitalocean.com/ubuntu bionic InRelease [242 kB]
Hit:3 http://mirrors.digitalocean.com/ubuntu bionic-updates InRelease
Hit:4 http://mirrors.digitalocean.com/ubuntu bionic-backports InRelease
Get:5 http://security.ubuntu.com/ubuntu bionic-security/main i386 Packages [902 kB]
Get:6 http://security.ubuntu.com/ubuntu bionic-security/restricted i386 Packages [13.5 kB]
Get:7 http://security.ubuntu.com/ubuntu bionic-security/universe i386 Packages [973 kB]
Get:8 http://security.ubuntu.com/ubuntu bionic-security/multiverse i386 Packages [9208 B]
Get:9 http://mirrors.digitalocean.com/ubuntu bionic/main i386 Packages [1007 kB]
Get:10 http://mirrors.digitalocean.com/ubuntu bionic/restricted i386 Packages [9156 B]
Get:11 http://mirrors.digitalocean.com/ubuntu bionic/universe i386 Packages [8531 kB]
Get:12 http://mirrors.digitalocean.com/ubuntu bionic/multiverse i386 Packages [144 kB]
Get:13 http://mirrors.digitalocean.com/ubuntu bionic-updates/main i386 Packages [1197 kB]
Get:14 http://mirrors.digitalocean.com/ubuntu bionic-updates/restricted i386 Packages [20.2 kB]
Get:15 http://mirrors.digitalocean.com/ubuntu bionic-updates/universe i386 Packages [1555 kB]
Get:16 http://mirrors.digitalocean.com/ubuntu bionic-updates/multiverse i386 Packages [12.7 kB]
Get:17 http://mirrors.digitalocean.com/ubuntu bionic-backports/main i386 Packages [10.0 kB]
Get:18 http://mirrors.digitalocean.com/ubuntu bionic-backports/universe i386 Packages [10.3 kB]
Fetched 14.6 MB in 11s (1370 kB/s)
Reading package lists...
Building dependency tree...
Reading state information...
74 packages can be upgraded. Run 'apt list --upgradable' to see them.
+ sudo apt -y install curl wget file tar bzip2 gzip unzip bsdmainutils python util-linux ca-certificates binutils bc jq tmux netcat lib32gcc1 lib32stdc++6
WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
E: Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporarily unavailable)
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another process using it?
+ sudo debconf-set-selections
+ echo steam steam/license note ''
+ sudo debconf-set-selections
+ echo steam steam/question select 'I AGREE'
+ sudo apt -y install steamcmd
WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
E: Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporarily unavailable)
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another process using it?
【问题讨论】:
-
从
$ssh->exec(...)返回的错误(错误代码和错误消息)是什么? -
@pynexj 我没有看到任何错误,只是没有安装软件包。我只看到过一次
Could not get lock /var/lib/dpkg/lock-frontend,但这似乎更像是问题的副作用,而不是问题本身。 -
您可以尝试
$ssh->exec('bash -x install.sh >& install.log')之类的方法并查看日志文件中的内容。 -
@pynexj 我会试一试,看看我想出了什么。我只是不明白为什么手动运行脚本会起作用,但是如果 PHP 做完全相同的事情,就会出现问题。
-
不确定您的脚本是否需要在 tty 上运行。尝试为 ssh 连接分配一个 pty。