Skip to content Skip to main navigation Skip to footer

Linux:在 Windows 世界中使用 Linux

简介: Linux 是互联网上大多数服务器首选的操作系统,而且现在越来越多地用作桌面操作系统。但是,在桌面上简单地迁移到 Linux,无法保证仍然可与您的工作或兴趣所需要的所有企业资源交互。本文探讨要与遗留 Microsoft Windows 文件和文件服务器交互,以及从桌面 Linux 系统使用新的网络硬件时,您需要执行的其他配置任务。

  每一年,Linux 新闻记者和爱好者都会公开讨论,下一年是否会成为 “Linux 桌面” 之年。尽管购买一台已在运行 Linux 的新机器或将现有的 Windows 系统迁移到 Linux 比以往更加容易,但简单地安装和启动 Linux 还不足以将其打造为日常使用的操作系统。您可能已开始在桌面上使用 Linux,但您使用新 Linux 系统的环境可能不那么现代化。大部分企业、中小型企业,以及小型办公室/家庭办公环境都拥有必须考虑的 Windows 相关需求。您可能还需要将仅在 Windows 平台上能得到有效支持的硬件用于 Linux 系统。所幸,这些问题已存在各种各样的解决方案。

访问共享的 Windows 文件系统

  访问共享的 Windows 文件系统可能是 Linux 系统用户最常见的业务需求。许多企业仍在使用 Windows 作为基础架构的核心,以支持企业邮件和日历系统(比如 Microsoft Exchange Server),以及通过导出的文件系统(一般称为 Windows 共享)来支持简单的文件和数据共享。

  Linux 提供了多种方式来访问 Windows 共享。具体选择哪种机制,依赖于您需要访问 Windows 共享上的数据的频率,以及您配置的 Linxu 系统是个人、单用户系统还是多个用户共享的系统。

从命令行访问 Windows 共享

  Samba Project(参见 参考资料) 是一个开源项目,支持 Linux、UNIX 和其他类似 UNIX 的操作系统与 Windows 互操作。大部分 Linux 发行版的存储库中都包含 Samba,而且一般通过安装和配置来支持 Linux 系统能够加入一个现有的 Windows 工作组或域并与其互操作,常常用作一个可供 Windows 系统使用的通用互联网文件系统 (Common Internet File System, CIFS) 文件服务器。Samba 4.x 安装还允许 Samba 服务器充当 Windows 域的一个活动目录域服务 (Active Directory Domain Service) 控制器和集成的域名系统 (Domain Name System)。

  尽管 Samba 服务器提供了一种优秀机制来从 Windows 系统提供 Linux 资源,使 Linux 系统可打印到 Windows 打印机,但如果您感兴趣的只是偶尔从 WIndows 共享检索文件,安装和配置 Samba 服务器可能会大材小用。Samba 客户端包 (samba-client) 包含多个专为这类偶尔交互所设计的实用程序,包括 smbclient 应用程序,该应用程序提供了一个交互式命令行接口 (CLI) 来远程访问 Windows 共享。

  如果不确定远程 Windows 服务器上提供的共享名称,则可使用 smbclient 应用程序查询一个服务器,在服务器的名称或 IP 地址后键入 -L 选项来列出该服务器上的可用资源,如 清单 1 中所示。

清单 1. 使用 smbclient 列出 Windows 服务器资源

$ smbclient -L win2008server
Enter wvh's password:
Domain=[WORDSMITHS]
OS=[Windows (R) Small Business Server 2008 6001 Service Pack 1]
Server=[Windows (R) Small Business Server 2008 6.0]
Sharename        Type      Comment
---------        ----      -------
Address           Disk      "Access to address objects"
ADMIN$            Disk      Remote Admin
Brother HL-2070N  Printer   Brother HL-2070N
C$                Disk      Default share
ExchangeOAB       Disk      OAB Distribution share
IPC$              IPC       Remote IPC
NETLOGON          Disk      Logon server share
print$            Disk      Printer Drivers
Public            Disk
RedirectedFolders Disk
Resources$        Disk      "Event logging files"
SYSVOL            Disk      Logon server share
[...]

  如上所示,smbclient 应用程序使用当前的 Linux 用户作为要在远程 Windows 服务器上验证的用户,并提示用户输入密码来访问远程服务器。如果 Windows 服务器上的登录名不同,则可使用 -U 选项指定要使用的登录名。

  确定希望连接到的共享的名称后,可使用 smbclient 应用程序连接到一个特定的共享,以检查或检索文件,如 清单 2 中所示。

清单 2. 使用 smbclient 从 Windows 共享中检索文件

$ smbclient //win2008server/Public
Enter wvh's password:
Domain=[WORDSMITHS]
OS=[Windows (R) Small Business Server 2008 6001 Service Pack 1]
Server=[Windows (R) Small Business Server 2008 6.0]
smb: \> cd Software\Linux
smb: \Software\Linux\> ls
  .                            D        0  Sun Jan 27 23:40:42 2013
  ..                           D        0  Sun Jan 27 23:40:42 2013
  acl82express-linux-x86.bz2   A 44960643  Sun Jan 27 23:40:24 2013
  alien_8.87.tar.gz            A    64336  Sun Jan 27 23:39:24 2013
  crossover-12.1.0-1.i386.rpm  A 47233108  Sun Jan 27 23:39:14 2013
  [...]
		59997 blocks of size 1048576. 32474 blocks available
smb: \Software\Linux\> get softmaker-office-2012-674.x86_64.rpm
getting file \Software\Linux\softmaker-office-2012-674.x86_64.rpm \
        of size 147058656 as softmaker-office-2012-674.x86_64.rpm \
        (16345.5 KiloBytes/sec) (average 16345.5 KiloBytes/sec)
smb: \Software\Linux\> quit

  清单 2 中的示例表明,smbclient 提供了一个 CLI 来连接远程服务器。此接口支持熟悉的 Linux 命令,比如 cd(用于在远程服务器上的目录中移动)和 ls(用于列出给定目录的内容)。找到希望检索的文件后,可使用 get 命令检索该文件,将其存储在您希望从中执行 smbclient 的目录中。要将检索到的文件存储在另一个目录中,可使用 lcd(本地更改目录)命令来更改 smbclient 视为当前目录的目录。

  如果仅需要偶尔访问 Windows 共享中的一个或多个文件,且并不关心使用文件管理器(比如 Gigolo、GNOME Nautilus、KDE Dolphin、Konqueror 或 Thunar)来以图形方式浏览 Windows 共享,那么可以放心地使用 smbclient 应用程序。smbclient 应用程序使一个远程共享可在该应用程序的上下文中使用,而不是在您的整个系统中使用。要浏览 Windows 共享并将其提供给您选择的应用程序,则必须采用挂载本地文件系统的相同方式将该共享挂载到您的系统上。

永久挂载 Windows 共享

  可将 Windows 共享手动挂载在系统上的目录上,方法是以 root 用户身份使用 mount 命令或使用 sudo 应用程序,如 清单 3 中所示。mount 命令的 -t 选项及其 cifs 参数指定您挂载的文件系统类型,而且在此情况下,会导致一般性的 mount 命令调用 /bin/mount.cifs 命令。使用您系统的 package-management 命令安装 cifs-utils 程序包,该程序包是 Samba 套件的一部分。

清单 3. 挂载并列出手动挂载的 Windows 共享的内容

# mkdir /mnt/PUBLIC
# mount -t cifs //winserver2008/Public /mnt/PUBLIC
Password:
# ls -l /mnt/PUBLIC
total 1
drwxr-xr-x. 1 root root   0 Jan 27 16:19 Desktop
-rwxr-xr-x. 1 root root 174 Jan 19  2008 desktop.ini
drwxr-xr-x. 1 root root   0 Jan 19  2008 Documents
drwxr-xr-x. 1 root root   0 Jan 27 23:38 Downloads
drwxr-xr-x. 1 root root   0 Jan 19  2008 Favorites
drwxr-xr-x. 1 root root   0 Jan 19  2008 Music
drwxr-xr-x. 1 root root   0 Jan 19  2008 Pictures
drwxr-xr-x. 1 root root   0 Jan 27 23:37 Software
drwxr-xr-x. 1 root root   0 Jan 19  2008 Videos

  清单 3 中的示例 mount 命令使远程共享可通过 /mnt/PUBLIC 目录使用,但具有一些缺点:

  • 简单地将此命令添加到 /etc/fstab 文件中无法自动挂载该共享,因为您在执行 mount 命令后会被提示输入密码。如果尚未确定要用于验证的特定用户,就必须为用于执行 su 或 sudo 命令的用户提供远程 Windows 密码。
  • 以 root 用户身份执行 mount 命令,将共享挂载为 root 用户所有的资源。如果仅希望读取该共享中的文件,尽管可通过此方式挂载共享,但您只能以 root 用户身份向挂载的共享写入数据,这通常很不方便。

  要解决这些问题,可在执行 mount 命令时指定特殊的 CIFS 相关选项,以挂载一个 CIFS 共享。这些选项包括:

  • username= – 指定将用于对远程共享进行验证的用户。可将此选项缩写为 user=。
  • password= – 指定将对远程共享进行验证的用户(您将该用户指定为将使用的用户)的密码。
  • uid= – 指定将拥有所挂载共享中的文件和目录的用户 ID (UID)。如果在 Linux 桌面上使用密码文件身份验证方式,则可使用grep命令在系统的密码文件中搜索您的登录名,以找到您的 UID,如以下示例中所示。
    $ grep wvh /etc/passwd
    wvh:x:500:500:William von Hagen:/home/wvh:/bin/bash
    

    UID 是密码文件条目中的第三个字段(在本例中为 efficiently500)。

  • gid= – 指定将拥有所挂载共享中的文件和目录的用户的组 ID (GID)。如果在 Linux 桌面上使用密码文件身份验证方式,则可使用 grep 命令在系统的密码文件中搜索您的登录名,以找到您的 GID。GID 是密码文件条目中的第四个字段,如上面的示例中所示。

  下面给出了一个使用这些选项的示例 mount 命令,出于格式化用途将该命令分为两行:

# mount -t cifs -o username=wvh,password=MYPASSWORD,uid=500,gid=500 \
     //win2008server/Public /mnt/PUBLIC

 

  可从 CLI 使用一条类似这样的命令或向 /etc/fstab 文件添加一个类似条目,以在启动系统时自动挂载该文件系统。以下是与前面的 mount 等效的 /etc/fstab 文件条目:

//win2008server/Public /mnt/PUBLIC cifs \
    username=wvh,password=MYPASSWORD,uid=500,gid=500 0 0

 

  此命令将在 /etc/fstab 文件中显示为一行,但在本例中出于格式化用途而分为多行。遗憾的是,此命令具有明显的安全问题,因为您必须在 /etc/fstab 条目中公开密码,而文件 /etc/fstab 通常可供系统上的每个用户读取。要解决此问题,可使用 credentials 挂载选项将用户名和密码放在指定的文本文件中。例如:

//win2008server/Public /mnt/PUBLIC cifs \
    credentials=/etc/cred.wvh,uid=500,gid=500 0 0

 

  一个 credentials 文件的格式如下所示:

username=wvh
password=MYPASSWORD

 

  然后可使用以下命令,使 /etc/cred.wvh 文件仅可供 root 用户(必须以其身份执行 mount 命令的用户)读取:

# chmod 600 /etc/cred.wvh

 

  使用 credentials 挂载选项,可在每次挂载文件系统时必须指定用户名和密码,与不向每个能访问系统的人公开该信息之间实现很好的平衡。

0 Comments

There are no comments yet

Leave a comment

Your email address will not be published.