先决条件
要充分理解本文,必须具备Windows 环境下桌面应用程序的工作经验,我认为读者对如何使用 Linux 桌面有一个基本的了解。使用一个运行的
Linux 计算来机探讨本文的概念和示例是很有帮助的。
概述
有时候第一次在 Linux
上运行一个应用程序需要一点额外工作。有些应用程序,比如服务器服务,可能无法安装为服务,因此您需要从命令行启动这些应用程序。对于启动这些应用程序的用户帐户而言,需要在应用程序文件中设置执行许可标志
(x)。
运行用户空间应用程序
Linux 在内核空间或用户空间运行进程。用户空间
是操作系统的区域,应用程序通常在此运行。简单地说,每个用户帐户有其自己的用户空间,应用程序在这个领域内运行。
默认情况下,只有 root 用户有权访问内核空间。root 用户 是 Linux 中的超级用户,相当于 Windows 中的管理员帐户。在 root
用户帐户下运行应用程序可能会引起安全风险,是不可取的。
很多服务器服务需要 root 权限启动服务。然而,服务启动后,root 帐户通常会将其移至服务帐户。严格地说,Linux 中的服务帐户
才是标准的用户帐户。主要区别是服务帐户仅用于运行一个服务,而不是为任何实际登录的用户准备的。
设置权限
您可以使用 chmod 命令在一个文件中设置执行权限。在 Linux 中,umask
设置通常用来防止下载的文件被执行,也有充分的理由相信,因为它有助于维护 Linux 计算机的安全性。
大多数 Linux 发行版具有一个值为 022 的 umask 设置,这意味着,默认情况下一个新文件权限设置为 644.权限的数字表示形式采用读
(4)、写 (2)、执行 (1) 的格式。因此,默认权限为 644 的应用程序下载意味着文件所有者有读写权限,而组用户和其他用户只有读权限。
例如,为每个人赋予一个文件的执行权限,使用 chmod a+x 命令。a 表示所有人,加号 (+) 表示添加,而 x
表示执行。同样地,如果应用程序是一个服务器服务,您应该确保只有授权帐户才有权执行此服务。
如果一个应用程序能够在标准用户帐户权限下运行,但只有特定组中的用户才需要使用它,您可以将该组所有者权限设置为可执行,然后将这些用户添加到该组中。
更具体地说,您可以在一个可执行文件中设置访问控制列表 (ACL) 权限,赋予特定用户或组权限来运行该应用程序。使用 setfacl 实用工具设置
ACL 权限。
对于这些需要以 root 用户启动进程的应用程序,比如服务器服务,您有几个选择。总结了允许用户执行需要 root 权限的服务器服务的各种选项。
选项 描述
作为 root 用户 不推荐用于服务器服务。当用户已经知道 root 密码而且应用程序泄露不是首要关注问题时,可用于应用程序。
SetUID 由于安全问题,不推荐使用。SetUID 允许标准用户以另一个用户方式,比如 root 用户,执行一个文件。
sudo 很常用,并且被认为是一个很好的实践。sudo 授予一个用户或组成员权限以执行可能额外需要 root 权限的文件。该用户不需要知道 root
密码。
带有文件权限的标准用户帐户 在一个文件上为用户所有者、组所有者或其他人(所有人)设置执行权限。这是授予那些不需要 root
权限来执行应用程序的用户的常用方法。
带有 ACL 权限的标准用户帐户 使用较少,但是如果您不想授予一个用户 sudo 访问或者更改文件的权限,这也是一个可行的解决方案。在一个文件上使用
setfacl 命令,您可以授予一个特定用户或用户组执行该文件的权力。
从命令行运行
在管理 Linux 服务器时,从命令行运行应用程序是一项基本的任务。很多应用程序使用 shell 脚本(类似于 Windows 批处理文件
.bat)来启动应用程序并执行其他任务,比如设置变量以及为其他用户分配进程。例如,应用程序可能需要一个 java? Virtual Machine (JVM)
来执行。那样的话,shell 脚本可以设置适当的环境变量,然后执行 Java 命令来运行 Java Archive (JAR) 或类文件。这同样适用于使用
Perl、Python、甚至 C# 的应用程序。(当然,C# 编译的应用程序可以在 Linux 上运行)
从命令行或者 shell 提示符执行应用程序的一个常用方法是使用 ./ 命令。如果您在 Linux 中使用句号 (。) 和正斜杠
(/),就意味着告诉环境您想要以可执行文件运行该文件。例如,运行一个名为 myapp 的可执行文件,您可以使用 ./myapp
命令。同样地,您可以在文件名之前加上语言环境,比如:
sh
python
perl
java
但更多情况下,套装应用程序使用 shell 脚本,以 #! 符号设置环境变量提供该语言的运行时可执行路径,比如
#!/usr/bin/python.您也应该熟悉这种方法。
清单 1 使用 catalina.sh 默认脚本通过 ./ 方法启动 Apache Tomcat 应用程序服务器。然后,使用 sh
方法启动服务器。因为默认端口是 8080,标准用户不需要对其进行特别修改就可以启动该服务。
清单 1. 从命令行执行应用程序
考虑启动一个典型 Hypertext Transfer Protocol (HTTP) Web 服务器。在 Linux 中,任何低于 1024
的端口被认为是一个权限端口,只有 root 可以打开权限端口。因为,默认情况下,Web 服务器运行于端口 80,root 需要启动该进程。然而,如上所述,以
root 用户运行一个服务被认为是不安全的。正确的步骤是以 root 启动 该服务,然后将其转移到一个标准用户或者服务帐户。
幸运的是,许多服务器服务由脚本来执行这一操作。如果您从头开始构建 Apache Web 服务器,您将会发现它以 root 用户启动,然后将 httpd
线程转交给 apache 用户。
清单 2 启动一个默认的 Apache 2 Web 服务器编译。安装流程也做了一些事情,包括使 apachectl 命令可执行。因为该流程需要使用端口
80,使用 root 用户权限启动。然而,ps 命令显示 httpd 流程在 apache 用户帐户下运行。
清单 2. 启动 Apache Web 服务器
在后台运行应用程序
一些安装的软件可能不像 Apache Web
服务器那样用户友好。您很可能需要在流程启动后以后台方式运行它,除非您正在进行故障排除,或者想要看看应用程序到底怎么了。如果您没有这么做,shell
关闭后应用程序将终止。运行服务器服务时,可不希望每次关闭终端 shell 或者退出时服务都会停止!
如果在后台运行一个应用程序,即使关闭了 shell 窗口,应用程序也会继续运行。您可以通过在执行命令结尾附加一个 (&)
符号来启动应用程序。例如,您可以使用 vi 编辑器打开文件,然后使用 vi /etc/sysconfig/network & 命令在后台运行该文件,因为
& 可以打开 /etc/sysconfig/network 文件并将其保留在后台。即使在退出后,您也可以使用 nohup
实用工具支持进程继续运行。例如,nohup vi /etc/sysconfig/network &.
清单 3 在 Vim 编辑器中打开一个用来编辑的文件,然后将其放在后台。
清单 3. 在后台运行应用程序
您可以输入 jobs 命令来查看您在后台上运行的所有应用程序。为在后台上运行的每个任务分配了一个序列号,从 1 开始。 清单 3 中的任务序列号是
1.24940 是进程 ID (PID)。您可以使用 fg 命令和特定的任务号将应用程序移到前台。在本例中,进程没有被用户所使用,因此显示为
Stopped.但是,命令 fg 1 打开终端并回到编辑文件的活动进程。
从桌面运行应用程序
在 Linux 中从桌面运行图形用户界面 (GUI) 应用程序与在 Windows
中没多大区别。通常,您需要了解特定的桌面环境下应用程序在菜单中是如何分组的。Linux 有足够的桌面应用程序,可用于各种任务。有一些应用程序是 Linux
本机固有的,还有另外一些应用程序可能是在一个常用运行时环境中使用 C# 开发的跨平台应用程序,比如,。NET Framework 应用程序。您会发现,使用一个
Wine 这样的虚拟环境,您甚至可以在 Linux 上运行您最喜爱的 Windows 应用程序。
Linux 本机应用程序
您很有可能会为您最喜爱的基于 Windows 的应用程序找到一个替代的 Linux 应用程序。在桌面上运行 Linux 本机应用程序比较直观。与
Windows 一样,您通常可以在菜单中找到这些已组织的应用程序,当您想要一个 Windows 应用程序时,只需单击并运行即可。
对于那些需要 root 权限的应用程序,将会提示您输入 root 密码,然后才开始运行。这在概念上类似于 Windows 中的 Run as
Administrator 选项。否则,您运行的所有程序都会位于您所登录帐户的用户空间中。
在 Windows 中,您可以创建桌面快捷键。Linux 也有类似的快捷键 launcher,您可以将它放在面板或桌面上。单击 launcher
时,快捷键将执行程序。
图 1 显示 GNOME Desktop 上 Mozilla Firefox Web 浏览器的两个 launcher.一个 launcher
位于面板上,另一个位于桌面上。
图 1. 查看桌面或面板上的 launcher
Mono
许多 Windows 应用程序都是使用 .NET Framework 开发的。Mono 是 .NET 的一个开源实现,可在很多平台上运行(包括
linux)。事实上,Mono 网站称其为 C# 和 Common Language Runtime (CLR) 的一个实现,与 .Net
是二进制兼容的。此项目目前由 Xamarin 支持。
在 Linux 上,您可以执行使用 .NET framework(或 Mono)开发的应用程序,就像在 Windows 上一样。但是,记住 Linux
umask 和默认文件权限。您仍然需要提供文件的执行权限,这样 Linux 才会允许执行可执行文件。
在 Mono(可以安装在您的 Linux GNOME 桌面上)上开发的一些跨平台应用程序,比如 F-Spot,同本机 GNOME
应用程序一同位于菜单中。F-Spot 是一个管理照片的开源应用程序。尽管它是 C# 应用程序,但是在 GNOME
桌面上表现为一个本机应用程序。为应用程序创建一个 launcher 后,就可以像在 Windows 中那样单击并运行。
图 2 演示了基于 Mono 的应用程序 F-Spot 的位置,以及为其创建桌面或面板 launcher 的方法。
Wine
Wine 使您可以在 Linux 和其他操作系统上运行 Windows 软件。有了 Wine,您就可以像在 Windows
中那样安装和运行应用程序。Wine 仍然在积极的发展中,而且并不是所有的 Windows 程序都可以使用 Wine.如果您的应用程序是为 Windows
操作系统编译的,您就会发现它可以使用 Wine 来充分运行,前题是它是一个桌面应用程序而不是一个服务器应用程序。一定要检查 Wine 文档关于在 Linux
上运行该应用程序的可行性,因为 Wine 并不完全支持所有的应用程序。
当您在 Linux 中使用 Wine 时,在您帐户主目录下有一个模拟 Windows 环境的隐藏文件夹,如 清单 4 所示。
清单 4. 模拟 Windows 环境的 Wine 的隐藏文件夹
使用 Wine 安装一个应用程序之后,您通常可以在桌面菜单中找到它,然后以在 Windows 中同样的方式来运行。
例如,Camstudio 是一个开源工具,用于记录和管理屏幕视频。目前还没有 Linux 操作系统的版本。但是,使用 Wine 就可以在 Linux
桌面安装 Windows 版本。与 Wine 相关的应用程序通常分组为 Applications > Wine > Programs,如 图 3
所示。
结束语
在管理一个 Linux
服务器时,您肯定会遇到从桌面和命令行执行软件的问题。了解如何设置适当的权限和用户帐户后,您就可以安全地运行这些应用程序。使用长期运行的进程,比如服务器服务,您可以从命令行执行,并在后台进行适当设置。如果您的应用程序适合于从桌面运行,也可以那样做,有时候甚至可以是
Windows 应用程序!