在启动时执行 shell 脚本的 Cubic 自定义 ISO

在启动时执行 shell 脚本的 Cubic 自定义 ISO

我正在尝试使用 Cubic 自定义 Ubuntu ISO,以便在 Live 用户登录时运行几个 shell 脚本。我一直在遵循大量教程和大量说明,最终让它在某个时候正常工作。不幸的是,我无法重新创建设置,更糟糕的是,我删除了特定的 ISO,因为我以为我不需要它。到目前为止,我已通过 Cubic 中的 chroot 环境将我的 shell 脚本移动到 /etc/skel 目录,并通过添加 @reboot 命令修改了 crontab。之后,我让 Cubic 创建我的 ISO,并将其刷新到 USB。我启动了它,但意识到脚本尚未执行。我检查了主目录(因为那是 /etc/skel 的内容应该存放的地方),我的所有脚本都存在。我该如何让它正常工作?

答案1

除了使用之外chron,您还可以使用自动启动脚本来连接远程机器。

您应该设置基于密钥的远程机器的身份验证,这样就不需要用户交互。

在下面的说明中,根据需要替换以下值。

  • LOCAL- 您的本地计算机(运行 Cubic 的地方)的 IP 地址或主机名
  • REMOTE- 远程计算机的 IP 地址或主机名
  • n00dles- 本地计算机和/或远程计算机上的用户名
  • REMOTE_LOCATION_PATH- 您想要在远程计算机上挂载的目录的路径
  1. 为您的本地机器生成公钥和私钥。

    这些密钥将用于您的自定义 ISO。请注意安全隐患。任何获得您的自定义 USB 的人都可以登录到您的远程机器。

    在本地机器上执行以下命令(例如不在 Cubic 中)。

    cd ~
    ssh-keygen -t rsa
    

    接受默认值。输出将类似于以下内容。

    Generating public/private rsa key pair.
    Enter file in which to save the key (/home/n00dles/.ssh/id_rsa): 
    Enter passphrase (empty for no passphrase):
    Enter same passphrase again:
    Your identification has been saved in /home/n00dles/.ssh/id_rsa
    Your public key has been saved in /home/n00dles/.ssh/id_rsa.pub
    The key fingerprint is:
    SHA256:G48dcTOXpUhzWxuzwn8pgdOTP9WmlLtXBCJkkiSEywk n00dles@LOCAL
    The key's randomart image is:
    +---[RSA 3072]----+
    |     xxxxxx x xxx|
    |  x x  xxxxxxxxxx|
    |   x x    xxxxxxx|
    |    x      xxxxxx|
    |  x     x x  xxxx|
    |         x x  xxx|
    |  x     x x   x x|
    |               x |
    |  x              |
    +----[SHA256]-----+
    
  2. 设置远程登录。

    将公钥复制到远程计算机。请注意安全隐患。这将允许使用相应私钥从任何计算机进行远程连接。

    ssh-copy-id -i .ssh/id_rsa.pub user@host
    

    创建一个新known_hosts文件,将其复制到自定义 ISO。这将允许 Live 环境连接到远程计算机,而无需提示用户确认。

    暂时备份您当前的known_hosts文件。记得在必要时替换n00dles@REMOTEREMOTE_LOCATION_PATH

    mv ~/.ssh/known_hosts ~/.ssh/known_hosts.original
    
    # Login to the remote machine to automatically create a new `known_hosts` file.
    sudo mkdir /mnt/remote
    sshfs [email protected]:/REMOTE_LOCATION_PATH/ /mnt/remote/
    
    ECDSA key fingerprint is SHA256:XXXX.
    Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
    
    # Unmount the remote machine.
    fusermount -u /mnt/remote
    sudo rmdir /mnt/remote
    
    # Save the new known_hosts file.
    mv ~/.ssh/known_hosts ~/
    
    # Revert the original known_hosts file.
    mv ~/.ssh/known_hosts.original ~/.ssh/known_hosts
    
  3. 使用 Cubic 自定义 ISO。

    启动 Cubic 并在终端页面上执行以下操作。

    确保sshfs已安装,以便我们可以连接到远程机器。

    apt install sshfs
    

    将密钥和新known_hosts文件复制到自定义操作系统。

    cd /etc/skel
    mkdir .ssh
    chmod u=rwx,g=,o= .ssh
    cd .ssh
    

    打开文件浏览器(例如 Nautilus)并导航到本地~/.ssh目录。

    选择id_rsaid_rsa.pub并将它们拖到 Cubic 窗口以将它们复制到当前目录中/etc/skel.ssh

    打开文件浏览器(例如 Nautilus)并导航到您的主目录。

    选择新known_hosts文件并将其拖到 Cubic 窗口上以将其复制到当前目录中/etc/skel/.ssh

    确保正确设置了这些文件的权限;这非常重要。在 Cubic 中,执行以下操作:

    chmod u=rw,g=,o= id_rsa
    chmod u=rw,g=r,o=r id_rsa.pub
    chmod u=rw,g=r,o=r known_hosts
    
    ls -la
    
    -rw------- 1 root root 2602 Jun  7 09:35 id_rsa
    -rw-r--r-- 1 root root  566 Jun  7 09:35 id_rsa.pub
    -rw-r--r-- 1 root root  222 Jun  7 09:35 known_hosts
    

    为远程位置创建一个挂载点,确保所有用户都可以使用它,并Remote在每个用户的主目录中添加一个名为的链接。

    mkdir /mnt/remote
    chmod a+rw /mnt/remote
    ln -s /mnt/remote /etc/skel/Remote
    
  4. 创建一个脚本来挂载远程位置。

    nano /opt/mount_remote.sh
    

    将以下内容添加到脚本中。记得根据需要替换n00dles@REMOTE和。REMOTE_LOCATION_PATH

    #!/bin/bash
    # Mounts the remote location.
    # To mount use: sshfs [email protected]:/REMOTE_LOCATION_PATH/ /mnt/remote
    # To unmount use: fusermount -u /mnt/remote
    for i in {1..5}; do
        if mountpoint /mnt/remote; then
            echo "[email protected]:/REMOTE_LOCATION_PATH is mounted."
            break
        else
            # Attempt to mount the remote location to /mnt/remote
            echo "Attempt # $i to mount [email protected]:/REMOTE_LOCATION_PATH."
            sleep $i
            sshfs [email protected]:/REMOTE_LOCATION_PATH/ /mnt/remote
        fi
    done
    if mountpoint /mnt/remote; then
        echo "Successfully mounted [email protected]:/REMOTE_LOCATION_PATH."
    else
        echo "Unable to mount [email protected]:/REMOTE_LOCATION_PATH."
    fi
    

    输入CTRLX, Y,Enter以保存文件。

    $HOME如果需要,您可以使用脚本中的环境变量。

    使脚本可执行。

    chmod +x /opt/mount_remote.sh
    
  5. 创建一个自动启动文件,该文件在每个用户登录后运行。

    nano ~/mount_remote.desktop
    

    对于 XUbuntu 20.04+ 或更早版本的 Ubuntu,将以下内容添加到文件中。

    [Desktop Entry]
    Encoding=UTF-8
    Version=0.9.4
    Type=Application
    Name=mount_remote
    Comment=Mount remote location
    Exec=/opt/mount_remote.sh
    OnlyShowIn=XFCE;
    RunHook=0
    StartupNotify=false
    Terminal=false
    Hidden=false
    

    对于 Ubuntu 20.04+,将以下内容添加到文件中。

    [Desktop Entry]
    Type=Application
    Exec=/opt/mount_remote.sh
    Hidden=false
    NoDisplay=false
    X-GNOME-Autostart-enabled=true
    Name[en_US]=Mount Remote
    Name=Mount Remote
    Comment[en_US]=Mount remote location
    Comment=Mount remote location
    

    输入CTRLX, Y,Enter以保存文件。

    您可以添加Terminal=true*.desktop文件中以进行调试,但是一旦终端窗口自动关闭,远程位置将立即卸载。

  6. 将自动启动文件移动到正确的位置。您有两个选择。

    • 如果您想使用全局自动启动文件,请将其移动到/etc/xdg/autostart

      mv ~/mount_remote.desktop /etc/xdg/autostart
      
    • 如果您希望每个用户都有自己的自动启动文件副本,请将其移动到/etc/skel/.config/autostart。(用户将能够删除此文件,因为它将被放置在他们的主文件夹中)。

      mkdir -p /etc/skel/.config/autostart
      mv ~/mount_remote.desktop /etc/skel/.config/autostart
      
  7. 继续定制您的操作系统,并生成新的 ISO。

  8. 测试

    如果您使用远程主机名而不是 IP 地址,则在测试生成的 ISO 时,请确保 DNS 解析有效。在 VirtualBox 中,我通常将网络设置为使用“桥接适配器”而不是默认的“NAT”适配器。

相关内容