我正在尝试使用 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
- 您想要在远程计算机上挂载的目录的路径
为您的本地机器生成公钥和私钥。
这些密钥将用于您的自定义 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]-----+
设置远程登录。
将公钥复制到远程计算机。请注意安全隐患。这将允许使用相应私钥从任何计算机进行远程连接。
ssh-copy-id -i .ssh/id_rsa.pub user@host
创建一个新
known_hosts
文件,将其复制到自定义 ISO。这将允许 Live 环境连接到远程计算机,而无需提示用户确认。暂时备份您当前的
known_hosts
文件。记得在必要时替换n00dles@REMOTE
和REMOTE_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
使用 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_rsa
和id_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
创建一个脚本来挂载远程位置。
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
创建一个自动启动文件,该文件在每个用户登录后运行。
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
文件中以进行调试,但是一旦终端窗口自动关闭,远程位置将立即卸载。将自动启动文件移动到正确的位置。您有两个选择。
如果您想使用全局自动启动文件,请将其移动到
/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
继续定制您的操作系统,并生成新的 ISO。
测试
如果您使用远程主机名而不是 IP 地址,则在测试生成的 ISO 时,请确保 DNS 解析有效。在 VirtualBox 中,我通常将网络设置为使用“桥接适配器”而不是默认的“NAT”适配器。