linux基础-用户用户组+用户样式丢失+sudo+无法登陆的用户 等

本文深入探讨Linux系统中用户及用户组的管理,包括用户添加、删除、切换,以及如何通过修改用户组实现资源访问控制。同时,解析了sudo命令的使用,以及如何通过修改passwd文件控制用户登录。此外,还介绍了文件权限的概念,如rwx权限,以及如何使用chmod和chown命令进行权限调整。

一、用户用户组

  1. 和用户及用户组相关的命令有哪些?
[root@JD ~]# ll /usr/sbin/user*
-rwxr-x--- 1 root root 118192 Nov  6  2016 /usr/sbin/useradd
-rwxr-x--- 1 root root  80360 Nov  6  2016 /usr/sbin/userdel
-rwxr-x--- 1 root root 113840 Nov  6  2016 /usr/sbin/usermod
-rwsr-xr-x 1 root root  11296 Apr 13  2017 /usr/sbin/usernetctl
[root@JD ~]# ll /usr/sbin/group*
-rwxr-x--- 1 root root 65480 Nov  6  2016 /usr/sbin/groupadd
-rwxr-x--- 1 root root 57016 Nov  6  2016 /usr/sbin/groupdel
-rwxr-x--- 1 root root 57064 Nov  6  2016 /usr/sbin/groupmems
-rwxr-x--- 1 root root 76424 Nov  6  2016 /usr/sbin/groupmod
[root@JD ~]# 
  1. 添加用户
[root@JD ~]# useradd ruoze
[root@JD ~]# id ruoze
uid=1002(ruoze) gid=1002(ruoze) groups=1002(ruoze)
[root@JD ~]# 
[root@JD ~]# cat /etc/passwd | grep ruoze
ruoze:x:1002:1002::/home/ruoze:/bin/bash
[root@JD ~]# 
[root@JD ~]# cat /etc/group | grep ruoze      
ruoze:x:1002:
[root@JD ~]# 

useradd ruoze :创建一个普通用户 ruoze,默认创建这个名称的用户组ruoze, 设置这个用户 主组为ruoze,且创建家目录为 /home/ruoze,从/etc/skel/ 拷贝三个文件到家目录。相应配置更新到 /etc/passwd 和 /etc/group

  1. 删除用户后重新建
[root@JD ~]# userdel ruoze
[root@JD ~]# id ruoze
id: ruoze: no such user
[root@JD ~]# useradd ruoze
useradd: warning: the home directory already exists.
Not copying any file from skel directory into it.
Creating mailbox file: File exists
[root@JD ~]# cat /etc/group | grep ruoze
ruoze:x:1002:
[root@JD ~]# cat /etc/passwd | grep ruoze                            
ruoze:x:1002:1002::/home/ruoze:/bin/bash
[root@JD ~]# 

userdel ruoze后,/etc/passwd 和 /etc/group文件中内容会删除,但是家目录还在。此时重新创建 ruoze用户,提示useradd: warning: the home directory already exists.Not copying any file from skel directory into it.Creating mailbox file: File exists 也就是说,创建家目录和 从/etc/skel 拷贝文件的动作被省略了

  1. 模拟切换用户丢失样式
[ruoze@JD ~]$ pwd
/home/ruoze
[ruoze@JD ~]$ ls -la
total 12
drwx------  2 ruoze ruoze  59 Nov 17 10:31 .
drwxr-xr-x. 5 root  root   57 Nov 17 11:33 ..
-rw-r--r--  1 ruoze ruoze  18 Apr 11  2018 .bash_logout
-rw-r--r--  1 ruoze ruoze 193 Apr 11  2018 .bash_profile
-rw-r--r--  1 ruoze ruoze 231 Apr 11  2018 .bashrc
[ruoze@JD ~]$ rm -f .bash*
[ruoze@JD ~]$ exit
logout
[root@JD ~]# su - ruoze
Last login: Sun Nov 17 16:30:03 CST 2019 on pts/4
Last failed login: Sun Nov 17 16:33:46 CST 2019 on pts/4
There was 1 failed login attempt since the last successful login.
-bash-4.2$ 
-bash-4.2$ 

其实就是从/etc/skel 拷贝的文件丢失导致,重新拷贝登录即可

-bash-4.2$ ls -la /etc/skel/
total 24
drwxr-xr-x.  2 root root   59 Aug  8  2018 .
drwxr-xr-x. 86 root root 8192 Nov 17 16:29 ..
-rw-r--r--   1 root root   18 Apr 11  2018 .bash_logout
-rw-r--r--   1 root root  193 Apr 11  2018 .bash_profile
-rw-r--r--   1 root root  231 Apr 11  2018 .bashrc
-bash-4.2$ cp /etc/skel/.bash* ~/
-bash-4.2$ ls -la
total 16
drwx------  2 ruoze ruoze  79 Nov 17 16:35 .
drwxr-xr-x. 5 root  root   57 Nov 17 11:33 ..
-rw-------  1 ruoze ruoze  75 Nov 17 16:34 .bash_history
-rw-r--r--  1 ruoze ruoze  18 Nov 17 16:35 .bash_logout
-rw-r--r--  1 ruoze ruoze 193 Nov 17 16:35 .bash_profile
-rw-r--r--  1 ruoze ruoze 231 Nov 17 16:35 .bashrc
-bash-4.2$ exit
logout
[root@JD ~]# su - ruoze
Last login: Sun Nov 17 16:34:28 CST 2019 on pts/4
[ruoze@JD ~]$ 
[ruoze@JD ~]$ 

注意,安装软件,拷贝文件等要注意它的所属用户和所属组

  1. 用户组
    一个用户可以有多个组,但是只有一个主组
    创建一个bigdata组,将ruoze添加到bigdata组,然后更改bigdata为ruoze用户的主组
[root@JD ~]# groupadd bigdata   # 创建bigdata组
[root@JD ~]# id ruoze
uid=1002(ruoze) gid=1002(ruoze) groups=1002(ruoze)
[root@JD ~]# usermod -a -G bigdata ruoze  # 添加ruoze到bigdata组中,但不是主组
[root@JD ~]# id ruoze
uid=1002(ruoze) gid=1002(ruoze) groups=1002(ruoze),1003(bigdata)
[root@JD ~]# usermod -g bigdata ruoze   # 更改ruoze的主组为bigdata,此时原来的主组丢失
[root@JD ~]# id ruoze
uid=1002(ruoze) gid=1003(bigdata) groups=1003(bigdata)
[root@JD ~]# groupdel bigdata   #删除组,显示无法删除,因为有用户绑定为主组
groupdel: cannot remove the primary group of user 'ruoze'
[root@JD ~]# id ruoze
uid=1002(ruoze) gid=1003(bigdata) groups=1003(bigdata)
[root@JD ~]# usermod -g ruoze ruoze   # 重新指定主组,此时 bigdata未丢失
[root@JD ~]# id ruoze              
uid=1002(ruoze) gid=1002(ruoze) groups=1002(ruoze),1003(bigdata)
[root@JD ~]# groupdel bigdata   # 可删除
[root@JD ~]# id ruoze        
uid=1002(ruoze) gid=1002(ruoze) groups=1002(ruoze)
[root@JD ~]# 

修改一个组,建议显性地指定他的所有组

二、sudo命令

  1. 设置用户密码
[root@JD ~]# passwd ruoze
Changing password for user ruoze.
New password: 
BAD PASSWORD: The password is shorter than 8 characters
Retype new password: 
passwd: all authentication tokens updated successfully.
[root@JD ~]# 
  1. 切换用户
命令是否切换用户目录切换情况环境变量 .bash_profile.bashrc
su ruoze切换用户不切换到对应的家目录不执行执行
su - ruoze不仅切换用户切换该用户的家目录执行执行

所以,个人环境变量文件优先使用.bashrc
3. 普通用户获取root的最大权限
vi /etc/sudoers
ruoze ALL=(root) NOPASSWD:ALL # 所有命令都不输入密码
ruoze ALL=(root) ALL # 所有命令都输入密码

三、用户无法登录 passwd文件

[root@JD ~]# cat /etc/passwd | grep ruoze
ruoze:x:1002:1002::/home/ruoze:/bin/bash

更改/bin/bash为/bin/false 后切换ruoze用户,切换用户失败

[root@JD ~]# cat /etc/passwd | grep ruoze
ruoze:x:1002:1002::/home/ruoze:/bin/false
[root@JD ~]# su - ruoze
Last login: Sun Nov 17 17:22:41 CST 2019 on pts/4
[root@JD ~]#   

更改/bin/bash为/bin/nologin 后切换ruoze用户,切换用户失败

[root@JD ~]# cat /etc/passwd | grep ruoze     
ruoze:x:1002:1002::/home/ruoze:/bin/nologin
[root@JD ~]# su - ruoze                  
Last login: Sun Nov 17 17:26:17 CST 2019 on pts/4
su: failed to execute /bin/nologin: No such file or directory
[root@JD ~]# 

CDH 很多的组件使用的用户登录时无法登陆,其实就是/etc/passwd下对应的配置为上面两种,改成通用可登陆的就ok
hdfs组件 hdfs用户:su - hdfs; 对应修改为 /bin/bash
hbase组件 hbase用户:su - hbase; yarn组件 yarn用户

四、权限 rwx------ chmod chown 案例

  1. 文件/文件夹权限
[root@JD ~]# ll
total 12
-rwxrwxrwx 1 root root 8388 Oct 25 12:22 temp.txt
-rw-r--r-- 1 root root    0 Nov 17 17:23 test.sh
drwxr-xr-x 2 root root    6 Nov 17 17:29 tmp

第一个字符,文件属性: d文件夹 -文件 l连接,
后面三个字符为一组,分别代表用户、组、其他人的对这个文件的权限,
再之后数字是连接数,表示有多少文件名连接到此节点,
再之后是所属用户和所属组,
再之后是文件大小,单位bytes,
然后是文件最后被修改的时间,
最后是文件名

r: read 4
w: write 2
x: 执行 1
-: 没权限 0

一般来说,带参数R的,我们基本就用到这两个
chmod -R 777 文件夹/文件路径
chown -R 用户:用户组 文件夹/文件路径

五、 其他命令

  1. vi 异常关闭时产生的swp文件
[ruoze@JD ~]$ ls -la
total 28
drwx------  2 ruoze ruoze  129 Nov 17 17:42 .
drwxr-xr-x. 5 root  root    57 Nov 17 11:33 ..
-rw-------  1 ruoze ruoze  192 Nov 17 17:42 .bash_history
-rw-r--r--  1 ruoze ruoze   18 Nov 17 16:35 .bash_logout
-rw-r--r--  1 ruoze ruoze  193 Nov 17 16:35 .bash_profile
-rw-r--r--  1 ruoze ruoze  231 Nov 17 16:35 .bashrc
-rw-rw-r--  1 ruoze ruoze    4 Nov 17 17:42 test.txt
-rw-r--r--  1 ruoze ruoze 4096 Nov 17 17:42 .test.txt.swp
-rw-------  1 ruoze ruoze  596 Nov 17 17:42 .viminfo
[ruoze@JD ~]$ 

存在这个文件,编辑test.txt时会有以下类型提示:

E325: ATTENTION
Found a swap file by the name ".test.txt.swp"
          owned by: ruoze   dated: Sun Nov 17 17:44:14 2019
         file name: ~ruoze/test.txt
          modified: no
         user name: ruoze   host name: JD
        process ID: 27023 (still running)
While opening file "test.txt"
             dated: Sun Nov 17 17:42:27 2019

(1) Another program may be editing the same file.  If this is the case,
    be careful not to end up with two different instances of the same
    file when making changes.  Quit, or continue with caution.
(2) An edit session for this file crashed.
    If this is the case, use ":recover" or "vim -r test.txt"
    to recover the changes (see ":help recovery").
    If you did this already, delete the swap file ".test.txt.swp"
    to avoid this message.

Swap file ".test.txt.swp" already exists!
[O]pen Read-Only, (E)dit anyway, (R)ecover, (Q)uit, (A)bort:
  1. du

[ruoze@JD ~]$ du -sh .bash*
4.0K    .bash_history
4.0K    .bash_logout
4.0K    .bash_profile
4.0K    .bashrc
[ruoze@JD ~]$ 

不足4KB按4KB显示,和系统默认快大小有关

  1. find
    find /usr/local -name '*hadoop*' 指定目录下,按文件名查找特定文件
<think>我们正在讨论在Linux或Windows平台上使用Java实现Word转PDF的最推荐方法。根据之前的讨论,有几种方法,但最推荐的是使用JODConverter,因为它支持跨平台(Linux和Windows),并且可以利用已有的LibreOffice或Microsoft Office进行转换,保证格式的准确性。 另外,com.documents4j也是一个选择,但它主要依赖于Microsoft Office,因此更适合Windows环境,在Linux上可能不太方便(除非使用虚拟机或Wine等)。 因此,最推荐的跨平台方案是使用JODConverter配合LibreOffice(因为LibreOffice在Linux和Windows上都可以安装,且免费)。这样就不需要依赖Microsoft Office,尤其是在Linux上。 步骤: 1. 安装LibreOffice(在Linux上通过包管理器,在Windows上下载安装程序)。 2. 在Java项目中添JODConverter依赖。 3. 编写代码启动一个OfficeManager(连接本地安装的LibreOffice),然后进行转换。 下面是一个详细的示例: 首先,确保系统安装了LibreOffice。例如,在Ubuntu上: sudo apt install libreoffice 在Windows上,从官网下载并安装LibreOffice。 然后,在Maven项目中添依赖(注意:这里使用最新版本,请查看Maven仓库获取当前版本): ```xml <dependency> <groupId>org.jodconverter</groupId> <artifactId>jodconverter-local</artifactId> <version>4.4.6</version> <!-- 请检查最新版本 --> </dependency> ``` 编写转换代码: ```java import org.jodconverter.LocalConverter; import org.jodconverter.office.LocalOfficeManager; import org.jodconverter.office.OfficeManager; import java.io.File; public class WordToPdfConverter { public static void main(String[] args) { // 配置OfficeManager:使用本地安装的LibreOffice(自动检测路径) final OfficeManager officeManager = LocalOfficeManager.builder().install().build(); try { // 启动Office进程 officeManager.start(); // 执行转换 LocalConverter.builder() .officeManager(officeManager) .build() .convert(new File("input.docx")) .to(new File("output.pdf")) .execute(); System.out.println("转换完成!"); } catch (Exception e) { e.printStackTrace(); } finally { // 确保关闭Office进程 try { officeManager.stop(); } catch (Exception e) { e.printStackTrace(); } } } } ``` 注意:在Linux上,如果LibreOffice安装路径不在默认搜索路径中,可能需要使用`setOfficeHome`方法指定路径。例如,如果安装路径是`/usr/lib/libreoffice`,则: OfficeManager officeManager = LocalOfficeManager.builder() .setOfficeHome("/usr/lib/libreoffice") .install() .build(); 在Windows上,默认安装路径通常是`C:\Program Files\LibreOffice`,所以可以这样设置: OfficeManager officeManager = LocalOfficeManager.builder() .setOfficeHome("C:\\Program Files\\LibreOffice") .install() .build(); 优点: - 跨平台(Linux和Windows) - 转换质量高(因为使用LibreOffice,它支持Office文档的精确渲染) - 开源免费 缺点: - 需要安装LibreOffice,但这是大多数Linux系统自带的,Windows上安装也很方便 - 转换过程会启动LibreOffice进程,因此需要一定的系统资源 如果项目环境不允许安装LibreOffice,那么可以考虑使用纯Java库(如Apache POI + iText),但这样转换复杂格式时可能会丢失样式。 因此,在Linux或Windows平台上,使用JODConverter+LibreOffice是最推荐的。 引用说明: - 使用JODConverter进行转换的方法参考了之前的讨论[^3]。 -Linux上使用LibreOffice作为转换引擎是跨平台解决方案的关键[^3]。 相关问题: 1. 如何在Linux环境下安装和配置LibreOffice以支持JODConverter? 2. JODConverter在转换过程中出现异常如何排查? 3. 有没有不需要安装LibreOffice的纯Java Word转PDF解决方案?</think>在 Linux 或 Windows 平台上使用 Java 实现 Word 转 PDF 的**最推荐方案是 JODConverter + LibreOffice**,这是一个跨平台、开源且可靠的解决方案。以下是详细实现指南: --- ### 推荐方案:JODConverter + LibreOffice #### ✅ 优势 - **跨平台支持**:完美兼容 Linux/Windows/macOS - **格式保真度高**:保留原始文档样式、表格、图片等元素 - **无需 Microsoft 许可证**:使用免费开源的 LibreOffice 作为转换引擎 - **稳定可靠**:企业级应用验证的方案 #### 🔧 环境准备 1. **安装 LibreOffice**: - **Linux**(Debian/Ubuntu): ```bash sudo apt install libreoffice ``` - **Windows**: 从[官网下载安装包](https://www.libreoffice.org/) 2. **Java 项目依赖**(Maven): ```xml <dependency> <groupId>org.jodconverter</groupId> <artifactId>jodconverter-local</artifactId> <version>4.4.6</version> <!-- 检查最新版本 --> </dependency> ``` #### 💻 核心代码实现 ```java import org.jodconverter.LocalConverter; import org.jodconverter.office.LocalOfficeManager; import org.jodconverter.office.OfficeManager; import java.io.File; public class WordToPdfConverter { public static void convert(String inputPath, String outputPath) { // 配置Office管理器(自动检测LibreOffice路径) OfficeManager officeManager = LocalOfficeManager.builder() .install() // 自动查找系统安装路径 .build(); try { officeManager.start(); // 启动LibreOffice服务 LocalConverter.builder() .officeManager(officeManager) .build() .convert(new File(inputPath)) .to(new File(outputPath)) .execute(); System.out.println("转换成功: " + outputPath); } catch (Exception e) { e.printStackTrace(); } finally { try { officeManager.stop(); // 确保关闭服务 } catch (Exception e) { e.printStackTrace(); } } } public static void main(String[] args) { // 示例用法 convert("input.docx", "output.pdf"); } } ``` --- ### 🚀 关键配置说明 1. **路径自定义**(如自动检测失败): ```java // Linux 示例(Ubuntu默认路径) OfficeManager officeManager = LocalOfficeManager.builder() .setOfficeHome("/usr/lib/libreoffice") .build(); // Windows 示例 OfficeManager officeManager = LocalOfficeManager.builder() .setOfficeHome("C:\\Program Files\\LibreOffice") .build(); ``` 2. **性能优化**: ```java OfficeManager officeManager = LocalOfficeManager.builder() .setPortNumbers(2002, 2003, 2004) // 多端口支持并行转换 .setTaskExecutionTimeout(30_000) // 单任务超时30秒 .build(); ``` --- ### 🔍 备选方案对比 | 方案 | 跨平台 | 格式保真 | 依赖外部软件 | 推荐指数 | |---------------------|--------|----------|--------------|----------| | JODConverter+LibreOffice | ✅ | ⭐⭐⭐⭐⭐ | ✅ | ⭐⭐⭐⭐⭐ | | com.documents4j | ❌(仅Windows)| ⭐⭐⭐⭐ | ✅(需MS Office)| ⭐⭐ | | Apache POI+iText | ✅ | ⭐⭐ | ❌ | ⭐⭐ | | 在线API | ✅ | ⭐⭐⭐ | ❌(需网络) | ⭐⭐ | > 📌 结论:**JODConverter+LibreOffice 是最佳跨平台选择**,尤其适合需要高保真转换的本地化部署场景[^3]。 --- ### ⚠️ 常见问题解决 1. **Linux 权限问题**: ```bash # 添当前用户到libreoffice组 sudo usermod -aG libreoffice $USER ``` 2. **字体缺失**(PDF显示乱码): - Linux:将字体复制到`/usr/share/fonts/` - Windows:安装缺失字体到系统字体目录 3. **进程未关闭**:确保代码中调用`officeManager.stop()` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值