我可以通过 SSH 连接到一台服务器,但我无法使用其上的大量 HDD 空间。我想运行一个程序,但是这个程序很大,所以我不能只是将它复制到服务器上。有没有办法通过 SSH 在服务器上运行我的计算机上的程序?
(我的计算机和服务器都在同一个 LAN 上,我运行的是 Linux Mint,服务器运行的是 CentOS 版本 5.9(最终版))。
答案1
对于要在其进程之一中运行 ELF 二进制文件(如 python 解释器)的服务器,它必须能够将其映射到内存中。仅当文件位于虚拟文件系统上并且为其提供服务的文件系统支持该文件时,它才能执行此操作。
因此,您需要将该python
可执行文件(及其依赖项)复制到您具有写入访问权限的已安装文件系统之一上的服务器,或者通过某种网络文件系统(如 sshfs)将您的 mint 机器的文件系统安装在服务器上, nfs 或 cif。
要挂载文件系统,您需要超级用户权限,或者至少必须授予您其中一些权限(通过一些 suid 可执行文件,例如fusermount
)。该服务器的管理员只会将该权限授予受信任的用户,因为它的功能强大到足以被滥用并获得进一步的权限。
如果您无法挂载文件系统,另一种选择是在模拟操作系统中运行软件,例如使用qemu
.我首先要问的问题是:为什么需要在服务器上运行它?该程序必须访问服务器的哪些资源?您能否不将这些资源暴露给您的造币机并在那里运行软件呢?如果程序要在服务器上的虚拟机上运行,您也必须执行类似的操作。
要在服务器上启动一个 qemu VM 作为您的 mint 机器的副本,假设您在 mint 机器上使用 LVM 并且那里只有一个文件系统(根文件系统)/dev/mint_VG/root
,您可以执行以下操作:
拍摄一个 LVM 快照,
/dev/mint_VG/root
该快照将成为服务器上 VM 的根文件系统:sudo lvcreate -s -L10G -n root_vm_on_server mint_VG/root
将其导出为网络块设备:
sudo nbd-server -C /dev/null 12345 /dev/mint_VG/root_vm_on_server
将内核和 initrd 映像传输到服务器:
scp /boot/{vmlinux,initrd.img}-"$(uname -r)" server:
在服务器上,运行
qemu
为(可能在screen
或中tmux
):qemu -drive file=nbd:mint-machine:12345,if=virtio -m 4096 \ -kernel vmlinuz-xxx -initrd initrd.img-xxx \ -append 'root=/dev/vda ro init=/bin/bash' -monitor stdio -vnc :4 \ -smp 8,core=8
(此处使用 8 个虚拟 CPU 和 4GB 或 RAM 运行,并且一开始仅bash
在 VM 中运行)。
使用 VNC 查看器获取图形控制台server-machine:4
,或者如果不需要图形,也可以使用串行控制台。
如果你能说服服务器上的系统管理员让你使用kvm
(给你写权限/dev/kvm
),这会让它变得更有效率。
答案2
据我所知,没有 root 访问权限就无法完成:(
推理:安全性:在服务器上本地运行的程序或在您计算机上运行软件的另一台计算机与服务器上运行的程序有什么区别。
如果可以做到这一点,那将是一个僵尸网络。
因为我正在投票:(这发生的速度非常令人沮丧)他希望他的 LinuxMint 计算机上的一个程序能够在服务器上运行,而不需要他在服务器上安装该程序。如何在只有用户访问权限的情况下将本地计算机上的程序运行到其他服务器上?