我如何非交互式地更新FreeBSD系统(和端口)?

本质上,我正在寻找一个完全沉默,非交互式的版本

freebsd-update fetch freebsd-update install 

 portsnap fetch update 

对于FreeBSD <10,以下工作:

允许freebsd-update在没有附加到terminal的stdin情况下运行提取:

 sed 's/\[ ! -t 0 \]/false/' /usr/sbin/freebsd-update > /tmp/freebsd-update chmod +x /tmp/freebsd-update 

允许portsnap运行提取没有stdin连接到terminal:

 sed 's/\[ ! -t 0 \]/false/' /usr/sbin/portsnap > /tmp/portsnap chmod +x /tmp/portsnap 

学分: veewee


对于FreeBSD 10+,下面的@uchida答案应该是首选的!

在FreeBSD 10.0R和更高版本上,在freebsd-update上设置PAGER环境variables

 env PAGER=cat freebsd-update fetch freebsd-update install 

对于FreeBSD 10.0R及更高版本上的portsnap(8) ,缺省行为,即没有--interactive选项,是非交互式的。

 portsnap fetch update 

在FreeBSD-10.2上有一个新的选项来允许这个:

freebsd-update install --not-running-from-cron

从手册 :

  --not-running-from-cron Force freebsd-update fetch to proceed when there is no controlling tty. This is for use by automated scripts and orchestration tools. Please do not run freebsd-update fetch from crontab or similar using this flag, see: freebsd-update cron 

盲目安装更新(甚至是freebsd-update更新)可能是一件坏事: rc.conf一个选项会发生变化,并且您的计算机突然没有SSH守护进程了。

同样,你可能不想盲目地通过portsnap / portupgrade -a来安装所有可用的端口更新 – 你可能会采取一个主要的版本号冲突并打破宇宙,或者你可能只是有一个新的configuration选项需要的端口改变(你可以使端口接受他们的默认值,但有时这不是你想要的)。


最好的方法是使用像Puppet或radmind这样的configurationpipe理工具来部署您的更改。
根据您已成功升级和testing的方框制作机器模板,然后将其部署到环境的其余部分。 这可以确保您推出一个正常工作的系统configuration,而且您只需要执行一次手动步骤(在您模板化的机器上)。

对于FreeBSD版本> 11

freebsd-update是一个脚本,并且有“询问用户是否一切正常”的函数。 function是:

continuep()

在这个函数中只需要注释就足够了

返回0

之后,这个函数返回“y / n”问题的正面答案。

重要! 请记住,这不是build议,只有你自己的风险!

 # /tmp/freebsd-update -r 11.1-RELEASE upgrade ; while [ $? -eq 1 ] ; do sleep 3; /tmp/freebsd-update -r 11.1-RELEASE upgrade ; done