了解如何執(zhí)行在Linux上運(yùn)行的應(yīng)用程序
先決條件
要充分理解本文,必須具備Windows 環(huán)境下桌面應(yīng)用程序的工作經(jīng)驗(yàn),我認(rèn)為讀者對(duì)如何使用 Linux 桌面有一個(gè)基本的了解。使用一個(gè)運(yùn)行的 Linux 計(jì)算來(lái)機(jī)探討本文的概念和示例是很有幫助的。
概述
有時(shí)候***次在 Linux 上運(yùn)行一個(gè)應(yīng)用程序需要一點(diǎn)額外工作。有些應(yīng)用程序,比如服務(wù)器服務(wù),可能無(wú)法安裝為服務(wù),因此您需要從命令行啟動(dòng)這些應(yīng)用程序。對(duì)于啟動(dòng)這些應(yīng)用程序的用戶帳戶而言,需要在應(yīng)用程序文件中設(shè)置執(zhí)行許可標(biāo)志 (x)。
運(yùn)行用戶空間應(yīng)用程序
Linux 在內(nèi)核空間或用戶空間運(yùn)行進(jìn)程。用戶空間 是操作系統(tǒng)的區(qū)域,應(yīng)用程序通常在此運(yùn)行。簡(jiǎn)單地說(shuō),每個(gè)用戶帳戶有其自己的用戶空間,應(yīng)用程序在這個(gè)領(lǐng)域內(nèi)運(yùn)行。
默認(rèn)情況下,只有 root 用戶有權(quán)訪問(wèn)內(nèi)核空間。root 用戶 是 Linux 中的超級(jí)用戶,相當(dāng)于 Windows 中的管理員帳戶。在 root 用戶帳戶下運(yùn)行應(yīng)用程序可能會(huì)引起安全風(fēng)險(xiǎn),是不可取的。
很多服務(wù)器服務(wù)需要 root 權(quán)限啟動(dòng)服務(wù)。然而,服務(wù)啟動(dòng)后,root 帳戶通常會(huì)將其移至服務(wù)帳戶。嚴(yán)格地說(shuō),Linux 中的服務(wù)帳戶 才是標(biāo)準(zhǔn)的用戶帳戶。主要區(qū)別是服務(wù)帳戶僅用于運(yùn)行一個(gè)服務(wù),而不是為任何實(shí)際登錄的用戶準(zhǔn)備的。
設(shè)置權(quán)限
您可以使用 chmod 命令在一個(gè)文件中設(shè)置執(zhí)行權(quán)限。在 Linux 中,umask 設(shè)置通常用來(lái)防止下載的文件被執(zhí)行,也有充分的理由相信,因?yàn)樗兄诰S護(hù) Linux 計(jì)算機(jī)的安全性。
大多數(shù) Linux 發(fā)行版具有一個(gè)值為 022 的 umask 設(shè)置,這意味著,默認(rèn)情況下一個(gè)新文件權(quán)限設(shè)置為 644。權(quán)限的數(shù)字表示形式采用讀 (4)、寫(xiě) (2)、執(zhí)行 (1) 的格式。因此,默認(rèn)權(quán)限為 644 的應(yīng)用程序下載意味著文件所有者有讀寫(xiě)權(quán)限,而組用戶和其他用戶只有讀權(quán)限。
例如,為每個(gè)人賦予一個(gè)文件的執(zhí)行權(quán)限,使用 chmod a+x 命令。a 表示所有人,加號(hào) (+) 表示添加,而 x 表示執(zhí)行。同樣地,如果應(yīng)用程序是一個(gè)服務(wù)器服務(wù),您應(yīng)該確保只有授權(quán)帳戶才有權(quán)執(zhí)行此服務(wù)。
如果一個(gè)應(yīng)用程序能夠在標(biāo)準(zhǔn)用戶帳戶權(quán)限下運(yùn)行,但只有特定組中的用戶才需要使用它,您可以將該組所有者權(quán)限設(shè)置為可執(zhí)行,然后將這些用戶添加到該組中。
更具體地說(shuō),您可以在一個(gè)可執(zhí)行文件中設(shè)置訪問(wèn)控制列表 (ACL) 權(quán)限,賦予特定用戶或組權(quán)限來(lái)運(yùn)行該應(yīng)用程序。使用 setfacl 實(shí)用工具設(shè)置 ACL 權(quán)限。
對(duì)于這些需要以 root 用戶啟動(dòng)進(jìn)程的應(yīng)用程序,比如服務(wù)器服務(wù),您有幾個(gè)選擇??偨Y(jié)了允許用戶執(zhí)行需要 root 權(quán)限的服務(wù)器服務(wù)的各種選項(xiàng)。
選項(xiàng) | 描述 |
---|---|
作為 root 用戶 | 不推薦用于服務(wù)器服務(wù)。當(dāng)用戶已經(jīng)知道 root 密碼而且應(yīng)用程序泄露不是首要關(guān)注問(wèn)題時(shí),可用于應(yīng)用程序。 |
SetUID | 由于安全問(wèn)題,不推薦使用。SetUID 允許標(biāo)準(zhǔn)用戶以另一個(gè)用戶方式,比如 root 用戶,執(zhí)行一個(gè)文件。 |
sudo | 很常用,并且被認(rèn)為是一個(gè)很好的實(shí)踐。sudo 授予一個(gè)用戶或組成員權(quán)限以執(zhí)行可能額外需要 root 權(quán)限的文件。該用戶不需要知道 root 密碼。 |
帶有文件權(quán)限的標(biāo)準(zhǔn)用戶帳戶 | 在一個(gè)文件上為用戶所有者、組所有者或其他人(所有人)設(shè)置執(zhí)行權(quán)限。這是授予那些不需要 root 權(quán)限來(lái)執(zhí)行應(yīng)用程序的用戶的常用方法。 |
帶有 ACL 權(quán)限的標(biāo)準(zhǔn)用戶帳戶 | 使用較少,但是如果您不想授予一個(gè)用戶 sudo 訪問(wèn)或者更改文件的權(quán)限,這也是一個(gè)可行的解決方案。在一個(gè)文件上使用 setfacl 命令,您可以授予一個(gè)特定用戶或用戶組執(zhí)行該文件的權(quán)力。 |
從命令行運(yùn)行
在管理 Linux 服務(wù)器時(shí),從命令行運(yùn)行應(yīng)用程序是一項(xiàng)基本的任務(wù)。很多應(yīng)用程序使用 shell 腳本(類似于 Windows 批處理文件 .bat)來(lái)啟動(dòng)應(yīng)用程序并執(zhí)行其他任務(wù),比如設(shè)置變量以及為其他用戶分配進(jìn)程。例如,應(yīng)用程序可能需要一個(gè) Java™ Virtual Machine (JVM) 來(lái)執(zhí)行。那樣的話,shell 腳本可以設(shè)置適當(dāng)?shù)沫h(huán)境變量,然后執(zhí)行 Java 命令來(lái)運(yùn)行 Java Archive (JAR) 或類文件。這同樣適用于使用 Perl、Python、甚至 C# 的應(yīng)用程序。(當(dāng)然,C# 編譯的應(yīng)用程序可以在 Linux 上運(yùn)行)
從命令行或者 shell 提示符執(zhí)行應(yīng)用程序的一個(gè)常用方法是使用 ./ 命令。如果您在 Linux 中使用句號(hào) (.) 和正斜杠 (/),就意味著告訴環(huán)境您想要以可執(zhí)行文件運(yùn)行該文件。例如,運(yùn)行一個(gè)名為 myapp 的可執(zhí)行文件,您可以使用 ./myapp 命令。同樣地,您可以在文件名之前加上語(yǔ)言環(huán)境,比如:
- sh
- php
- python
- perl
- java
但更多情況下,套裝應(yīng)用程序使用 shell 腳本,以 #! 符號(hào)設(shè)置環(huán)境變量提供該語(yǔ)言的運(yùn)行時(shí)可執(zhí)行路徑,比如 #!/usr/bin/python。您也應(yīng)該熟悉這種方法。
清單 1 使用 catalina.sh 默認(rèn)腳本通過(guò) ./ 方法啟動(dòng) Apache Tomcat 應(yīng)用程序服務(wù)器。然后,使用 sh 方法啟動(dòng)服務(wù)器。因?yàn)槟J(rèn)端口是 8080,標(biāo)準(zhǔn)用戶不需要對(duì)其進(jìn)行特別修改就可以啟動(dòng)該服務(wù)。
清單 1. 從命令行執(zhí)行應(yīng)用程序
$ ./catalina.sh start Using CATALINA_BASE: /opt/apache-tomcat-7.0.26 Using CATALINA_HOME: /opt/apache-tomcat-7.0.26 Using CATALINA_TMPDIR: /opt/apache-tomcat-7.0.26/temp Using JRE_HOME: /usr Using CLASSPATH: /opt/apache-tomcat-7.0.26/bin/bootstrap.jar: /opt/apache-tomcat-7.0.26/bin/tomcat-juli.jar $ ./catalina.sh stop ..................................................................... $ sh catalina.sh start Using CATALINA_BASE: /opt/apache-tomcat-7.0.26 Using CATALINA_HOME: /opt/apache-tomcat-7.0.26 Using CATALINA_TMPDIR: /opt/apache-tomcat-7.0.26/temp Using JRE_HOME: /usr Using CLASSPATH: /opt/apache-tomcat-7.0.26/bin/bootstrap.jar: /opt/apache-tomcat-7.0.26/bin/tomcat-juli.jar |
幸運(yùn)的是,許多服務(wù)器服務(wù)由腳本來(lái)執(zhí)行這一操作。如果您從頭開(kāi)始構(gòu)建 Apache Web 服務(wù)器,您將會(huì)發(fā)現(xiàn)它以 root 用戶啟動(dòng),然后將 httpd 線程轉(zhuǎn)交給 apache 用戶。
清單 2 啟動(dòng)一個(gè)默認(rèn)的 Apache 2 Web 服務(wù)器編譯。安裝流程也做了一些事情,包括使 apachectl 命令可執(zhí)行。因?yàn)樵摿鞒绦枰褂枚丝?80,使用 root 用戶權(quán)限啟動(dòng)。然而,ps 命令顯示 httpd 流程在 apache 用戶帳戶下運(yùn)行。
清單 2. 啟動(dòng) Apache Web 服務(wù)器
# cd /usr/local/apache2/bin # apachectl start #ps aux | grep httpd apache 23094 0.0 0.3 11784 1912 ? S 10:41 0:00 /usr/sbin/httpd -k start apache 23095 0.0 0.3 11784 1912 ? S 10:41 0:00 /usr/sbin/httpd -k start apache 23096 0.0 0.3 11784 1912 ? S 10:41 0:00 /usr/sbin/httpd -k start apache 23097 0.0 0.3 11784 1912 ? S 10:41 0:00 /usr/sbin/httpd -k start apache 23098 0.0 0.3 11784 1912 ? S 10:41 0:00 /usr/sbin/httpd -k start |
在后臺(tái)運(yùn)行應(yīng)用程序
一些安裝的軟件可能不像 Apache Web 服務(wù)器那樣用戶友好。您很可能需要在流程啟動(dòng)后以后臺(tái)方式運(yùn)行它,除非您正在進(jìn)行故障排除,或者想要看看應(yīng)用程序到底怎么了。如果您沒(méi)有這么做,shell 關(guān)閉后應(yīng)用程序?qū)⒔K止。運(yùn)行服務(wù)器服務(wù)時(shí),可不希望每次關(guān)閉終端 shell 或者退出時(shí)服務(wù)都會(huì)停止!
如果在后臺(tái)運(yùn)行一個(gè)應(yīng)用程序,即使關(guān)閉了 shell 窗口,應(yīng)用程序也會(huì)繼續(xù)運(yùn)行。您可以通過(guò)在執(zhí)行命令結(jié)尾附加一個(gè) (&) 符號(hào)來(lái)啟動(dòng)應(yīng)用程序。例如,您可以使用 vi 編輯器打開(kāi)文件,然后使用 vi /etc/sysconfig/network & 命令在后臺(tái)運(yùn)行該文件,因?yàn)?nbsp;& 可以打開(kāi) /etc/sysconfig/network 文件并將其保留在后臺(tái)。即使在退出后,您也可以使用 nohup 實(shí)用工具支持進(jìn)程繼續(xù)運(yùn)行。例如,nohup vi /etc/sysconfig/network &。
清單 3 在 Vim 編輯器中打開(kāi)一個(gè)用來(lái)編輯的文件,然后將其放在后臺(tái)。
清單 3. 在后臺(tái)運(yùn)行應(yīng)用程序
# vi /etc/sysconfig/network & [1] 24940 # jobs [1]+ Stopped vi /etc/sysconfig/network |
從桌面運(yùn)行應(yīng)用程序
在 Linux 中從桌面運(yùn)行圖形用戶界面 (GUI) 應(yīng)用程序與在 Windows 中沒(méi)多大區(qū)別。通常,您需要了解特定的桌面環(huán)境下應(yīng)用程序在菜單中是如何分組的。Linux 有足夠的桌面應(yīng)用程序,可用于各種任務(wù)。有一些應(yīng)用程序是 Linux 本機(jī)固有的,還有另外一些應(yīng)用程序可能是在一個(gè)常用運(yùn)行時(shí)環(huán)境中使用 C# 開(kāi)發(fā)的跨平臺(tái)應(yīng)用程序,比如,.NET Framework 應(yīng)用程序。您會(huì)發(fā)現(xiàn),使用一個(gè) Wine 這樣的虛擬環(huán)境,您甚至可以在 Linux 上運(yùn)行您最喜愛(ài)的 Windows 應(yīng)用程序。
Linux 本機(jī)應(yīng)用程序
您很有可能會(huì)為您最喜愛(ài)的基于 Windows 的應(yīng)用程序找到一個(gè)替代的 Linux 應(yīng)用程序。在桌面上運(yùn)行 Linux 本機(jī)應(yīng)用程序比較直觀。與 Windows 一樣,您通??梢栽诓藛沃姓业竭@些已組織的應(yīng)用程序,當(dāng)您想要一個(gè) Windows 應(yīng)用程序時(shí),只需單擊并運(yùn)行即可。
對(duì)于那些需要 root 權(quán)限的應(yīng)用程序,將會(huì)提示您輸入 root 密碼,然后才開(kāi)始運(yùn)行。這在概念上類似于 Windows 中的 Run as Administrator 選項(xiàng)。否則,您運(yùn)行的所有程序都會(huì)位于您所登錄帳戶的用戶空間中。
在 Windows 中,您可以創(chuàng)建桌面快捷鍵。Linux 也有類似的快捷鍵 launcher,您可以將它放在面板或桌面上。單擊 launcher 時(shí),快捷鍵將執(zhí)行程序。
圖 1 顯示 GNOME Desktop 上 Mozilla Firefox Web 瀏覽器的兩個(gè) launcher。一個(gè) launcher 位于面板上,另一個(gè)位于桌面上。
圖 1. 查看桌面或面板上的 launcher
Mono
許多 Windows 應(yīng)用程序都是使用 .NET Framework 開(kāi)發(fā)的。Mono 是 .NET 的一個(gè)開(kāi)源實(shí)現(xiàn),可在很多平臺(tái)上運(yùn)行(包括 linux)。事實(shí)上,Mono 網(wǎng)站稱其為 C# 和 Common Language Runtime (CLR) 的一個(gè)實(shí)現(xiàn),與 .Net 是二進(jìn)制兼容的。此項(xiàng)目目前由 Xamarin 支持。
在 Linux 上,您可以執(zhí)行使用 .NET framework(或 Mono)開(kāi)發(fā)的應(yīng)用程序,就像在 Windows 上一樣。但是,記住 Linux umask 和默認(rèn)文件權(quán)限。您仍然需要提供文件的執(zhí)行權(quán)限,這樣 Linux 才會(huì)允許執(zhí)行可執(zhí)行文件。
在 Mono(可以安裝在您的 Linux GNOME 桌面上)上開(kāi)發(fā)的一些跨平臺(tái)應(yīng)用程序,比如 F-Spot,同本機(jī) GNOME 應(yīng)用程序一同位于菜單中。F-Spot 是一個(gè)管理照片的開(kāi)源應(yīng)用程序。盡管它是 C# 應(yīng)用程序,但是在 GNOME 桌面上表現(xiàn)為一個(gè)本機(jī)應(yīng)用程序。為應(yīng)用程序創(chuàng)建一個(gè) launcher 后,就可以像在 Windows 中那樣單擊并運(yùn)行。
圖 2 演示了基于 Mono 的應(yīng)用程序 F-Spot 的位置,以及為其創(chuàng)建桌面或面板 launcher 的方法。
圖 2. 為 F-Spot 創(chuàng)建一個(gè) launcher
Wine
Wine 使您可以在 Linux 和其他操作系統(tǒng)上運(yùn)行 Windows 軟件。有了 Wine,您就可以像在 Windows 中那樣安裝和運(yùn)行應(yīng)用程序。Wine 仍然在積極的發(fā)展中,而且并不是所有的 Windows 程序都可以使用 Wine。如果您的應(yīng)用程序是為 Windows 操作系統(tǒng)編譯的,您就會(huì)發(fā)現(xiàn)它可以使用 Wine 來(lái)充分運(yùn)行,前題是它是一個(gè)桌面應(yīng)用程序而不是一個(gè)服務(wù)器應(yīng)用程序。一定要檢查 Wine 文檔關(guān)于在 Linux 上運(yùn)行該應(yīng)用程序的可行性,因?yàn)?Wine 并不完全支持所有的應(yīng)用程序。
當(dāng)您在 Linux 中使用 Wine 時(shí),在您帳戶主目錄下有一個(gè)模擬 Windows 環(huán)境的隱藏文件夾,如 清單 4 所示。
清單 4. 模擬 Windows 環(huán)境的 Wine 的隱藏文件夾
$ cd /home/tbost/.wine/drive_c/windows $ls cf8e.tmp command explorer.exe Fonts help hh.exe inf Installer ls.txt Microsoft.NET notepad.exe pwd.txt regedit.exe rundll.exe system system32 system.ini temp twain_32.dll twain.dll winhelp.exe winhlp32.exe win.ini winsxs |
使用 Wine 安裝一個(gè)應(yīng)用程序之后,您通??梢栽谧烂娌藛沃姓业剿?,然后以在 Windows 中同樣的方式來(lái)運(yùn)行。
例如,Camstudio 是一個(gè)開(kāi)源工具,用于記錄和管理屏幕視頻。目前還沒(méi)有 Linux 操作系統(tǒng)的版本。但是,使用 Wine 就可以在 Linux 桌面安裝 Windows 版本。與 Wine 相關(guān)的應(yīng)用程序通常分組為 Applications > Wine > Programs,如 圖 3 所示。
圖 3. 使用 Wine 在 Linux 上運(yùn)行一個(gè) Windows 應(yīng)用程序
結(jié)束語(yǔ)
在管理一個(gè) Linux 服務(wù)器時(shí),您肯定會(huì)遇到從桌面和命令行執(zhí)行軟件的問(wèn)題。了解如何設(shè)置適當(dāng)?shù)臋?quán)限和用戶帳戶后,您就可以安全地運(yùn)行這些應(yīng)用程序。使用長(zhǎng)期運(yùn)行的進(jìn)程,比如服務(wù)器服務(wù),您可以從命令行執(zhí)行,并在后臺(tái)進(jìn)行適當(dāng)設(shè)置。如果您的應(yīng)用程序適合于從桌面運(yùn)行,也可以那樣做,有時(shí)候甚至可以是 Windows 應(yīng)用程序!