DEBIAN_FRONTEND=noninteractive
通过 SSH 远程执行脚本时有什么方法可以设置吗?
这样做我得到这个错误:
sudo: sorry, you are not allowed to set the following environment variables: DEBIAN_FRONTEND
DEBIAN_FRONTEND=noninteractive
我想准确设置在这个位置的原因是因为有时apt-get dist-upgrade
会显示一些用户交互的掩码(鞭尾)。由于想要通过远程运行此脚本,crontab -e
因此无需人工点击或按任何内容。因此,我需要将其关闭,否则脚本会卡住。
我尝试执行的脚本server_one
位于/usr/local/bin/perform-update
:
#!/bin/bash
sudo apt-get update
sudo DEBIAN_FRONTEND=noninteractive apt-get -y dist-upgrade
sudo apt-get -y autoremove
sudo snap refresh
server_two
我尝试使用以下命令调用它:
SERVER_COMMAND="perform-update"
ssh -i $HOME/.ssh/id_rsa backupuser@server_one $SERVER_COMMAND
我还为backupuser
on设置了适当的权限:server_one
sudo visudo
backupuser ALL=(ALL) NOPASSWD: /usr/local/bin/perform-update
backupuser ALL=(ALL) NOPASSWD: /usr/bin/apt-get
backupuser ALL=(ALL) NOPASSWD: /usr/bin/snap
DEBIAN_FRONTEND
您可以允许用户在使用 时设置变量sudo
,但是...您已授予用户使用 执行脚本的权限sudo
,因此没有理由在脚本sudo
内部使用。只需使用 运行脚本本身sudo
。将您的脚本更改为:
然后使用以下命令运行它:
也就是说,您应该使用
unattended-upgrades
而不是重新发明轮子。对于允许用户为特定命令设置环境变量的特殊情况,
SETENV
除了NOPASSWD
标记之外还添加标记。从man sudoers
:所以规则应该是这样的:
对于所有实际意图和目的,请参阅@muru 的回答。如果赶时间,只需
sudo
修改ssh
server_two上的线路即可,而/usr/local/bin/perform-update
无需编辑server_one上的脚本。但出于安全原因,应该完整遵循它,并在答案末尾加上我的编辑。如果我们换个角度思考事情会怎样呢?如果我们无法更改 server_two 上的命令而只能更改 server_one 上的命令怎么办?我一直在寻找 APT 选项来设置环境变量,但我发现的内容超出了我的预期。这是一个令人震惊的开箱即用的答案,只是为了证明您的
/etc/sudoers
保单需要受到保护。我不认为您打算提供
backupuser
完全的 root 访问权限。为了保护您的系统,您需要删除apt-get
和snap
中的行visudo
,然后按照 @muru 的答案进行操作。apt-get
编辑:除非您需要删除visudo
. 这 3 行应该只替换为第一行: