使用终端(有菜单)自动安装程序

使用终端(有菜单)自动安装程序

是否可以自动安装程序,当提取并运行时,它会打开菜单安装程序?(看起来安装程序没有任何我可以传递的选项)。

是否有一个软件包可以自动按下菜单中的按钮?

对于那些感兴趣的人,这个程序是ARM 版 CrossWorks

答案1

通常情况下,人们可以尝试--quiet, -q --help,但正如你所说,这在这里行不通。我们必须自己动手。

对于无人值守安装,我发现让安装在虚拟 X 服务器上运行很有用。我们可以将密钥发送到 X 服务器,而不会干扰当前屏幕。因此我们需要xvfbX.org 项目。我还想在安装过程中截取屏幕截图,以查看过程进行到哪里以及是否发生任何错误。我们需imagemagick要这样做。请注意,imagemagick 仅适用于 X 会话。目前不支持 wayland。

首先下载安装程序并解压。

cd ~/Downloads
wget http://cdn.rowleydownload.co.uk/arm/releases/arm_crossworks_4_1_0_linux_x64.tar.gz
tar xf arm_crossworks_4_1_0_linux_x64.tar.gz
cd ~/Downloads/arm_crossworks_4_1_linux_x64

然后执行这个脚本来自我的要点

#!/bin/bash
#
# source: https://askubuntu.com/questions/1002349/install-a-program-automatically-with-terminal-which-has-menus
# dependencies: sudo imagemagick xvfb

# constants
SERVERNUM=99
SCREENSHOT=status.png
CROSSWORKS_PID=
XVFB_PID=
PROGRESS_PID=
KEYS_PID=

# function find_free_servernum() taken from xvfb-run
# Xvfb is part of x.org and licensed under MIT
# http://opensource.org/licenses/mit-license.php
#
# Find a free server number by looking at .X*-lock files in /tmp.
find_free_servernum() {
    # Sadly, the "local" keyword is not POSIX.  Leave the next line commented in
    # the hope Debian Policy eventually changes to allow it in /bin/sh scripts
    # anyway.
    #local i

    i=$SERVERNUM
    while [ -f /tmp/.X$i-lock ]; do
        i=$(($i + 1))
    done
    echo $i
}

start_xvfb() {
    SERVERNUM=$(find_free_servernum)
    echo starting virtual DISPLAY at :$SERVERNUM
    export DISPLAY=:$SERVERNUM

    Xvfb $DISPLAY -screen 0 1280x800x16 &> /dev/null &
    XVFB_PID=$!
}

install_crossworks() {
    check_root
    if [ ! -e ./install_crossworks ]; then
        echo crossworks installation file not found
        exit 1
    fi
    timeout --kill-after=90s 90s sudo -n ./install_crossworks &
    CROSSWORKS_PID=$!

    crossworks_enter_keys &
    KEYS_PID=$!

    show_progress &
    PROGRESS_PID=$!

    if wait $CROSSWORKS_PID; then
        echo ok
    fi

    kill "$PROGRESS_PID" &> /dev/null
    kill "$KEYS_PID" &> /dev/null
}

crossworks_enter_keys() {
    # wait for archive to get checked for crc errors
    sleep 5
    # press next
    xdotool key KP_Enter
    sleep 1
    # accept license
    xdotool key Tab Tab Tab space Tab Tab KP_Enter
    sleep 1
    # select install directory
    xdotool key KP_Enter
    sleep 1
    # start installation
    xdotool key KP_Enter
    sleep 60
    # exit installation
    xdotool key KP_Enter
    sleep 1
}

show_progress() {
    while /bin/true; do
        take_screenshot
        echo -n .
        sleep 1
    done
}

take_screenshot() {
    import -window root $SCREENSHOT
    sudo chown $USER $SCREENSHOT
}

check_root() {
    if ! sudo -n /bin/true 2>/dev/null; then
        echo super user is required for installation.
        sudo /bin/true
    fi
}

check_installation() {
    if [ -e /usr/share/crossworks_for_arm_4.1/bin/crossstudio ]; then
        echo Crossworks installed.
        exit 0
    fi
}

cleanup() {
    kill "$PROGRESS_PID" &> /dev/null
    kill "$CROSSWORKS_PID" &> /dev/null
    kill "$XVFB_PID" &> /dev/null
    kill "$KEYS_PID" &> /dev/null
}

trap cleanup EXIT

check_installation
start_xvfb
install_crossworks
check_installation

一个大问题是,我猜测安装程序在需要下一个用户输入之前需要的时间。它可能因您的 CPU 而异。

另请注意,安装脚本仅适用于安装crossworks。脚本不适用于升级或者卸载

要再次卸载 crossworks,请执行

sudo /usr/share/crossworks_for_arm_4.1/bin/uninstall

如果有任何错误,请尝试查看status.png当前工作目录中的。它是来自 X 帧缓冲区的屏幕截图。

安装时它看起来会像这样:

屏幕截图中的状态图像

另请查看/usr/share/crossworks_for_arm_4.1/。有时,如果安装中止,此目录仍然存在,但并未完全填充所有必要的数据。

您可以尝试使脚本更加高级,即通过在需要击键时捕获状态图像并将它们的校验和与一些已保存的校验和进行比较以查看安装处于哪种状态。

相关内容