linux中sudo如何读取标准输入作为密码,避免每次都输入密码?

需求描述:

  今天想要在生产环境中,弄自动部署的脚本,但是现在呢,需要sudo权限,每次都要输入.就想看sudo如何能从标准输入读取密码.

操作过程:

1.原来的方法

[deployer@testvm ~]$ echo "deployer" | sudo netstat -ntlp
[sudo] password for deployer:     #仍然是需要输入密码的.

备注:即使使用管道,但是sudo还是没有读取到标准输入的内容.

2.查看sudo帮助文档,有-S选项,可以从标准输入中读入密码

[deployer@testvm ~]$ echo "deployer" | sudo -S netstat -ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      1135/sshd           
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      1610/master         
tcp        0      0 0.0.0.0:54268               0.0.0.0:*                   LISTEN      995/rpc.statd       
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      975/rpcbind         
tcp        0      0 :::16851                    :::*                        LISTEN      1680/modclusterd    
tcp        0      0 :::22                       :::*                        LISTEN      1135/sshd           
tcp        0      0 ::1:25                      :::*                        LISTEN      1610/master         
tcp        0      0 :::3306                     :::*                        LISTEN      1502/mysqld         
tcp        0      0 :::54539                    :::*                        LISTEN      995/rpc.statd       
tcp        0      0 :::111                      :::*                        LISTEN      975/rpcbind         
tcp        0      0 :::80                       :::*                        LISTEN      1621/httpd 

备注:所以呢,通过给sudo命令,指定-S选项,就能将管道的内容作为密码使用,也就实现自动脚本的目的.

 

sudo帮助文档解释(针对-S选项):

     -S          The -S (stdin) option causes sudo to read the password from the standard input instead of the terminal device.  The password must be followed by a newline
                 character.

 

文档创建时间:2018年7月25日15:37:44

转载于:https://www.cnblogs.com/chuanzhang053/p/9366291.html

<think>我们正在处理用户的问题:在Linux中创建用户,并在/opt/zjzy目录下启动需要密码输入的Java包。根据用户的需求,我们需要完成以下步骤:1.创建新用户(假设用户名为zjzy_user,但用户没有指定,我们可以建议或让用户自定义)2.将/opt/zjzy目录的权限设置为该用户可以访问(可能需要更改目录所有者或设置权限)3.确保该用户可以执行Java包,并且Java包在启动时需要输入密码(这意味着我们需要以该用户身份运行,并且能够提供密码输入)但是,用户没有提供具体的Java包名称和密码输入方式(例如,密码是作为参数还是通过标准输入)。我们假设密码是通过标准输入或参数传递的。另外,考虑到安全性和权限,我们可能不希望将密码明文写在脚本中。因此,我们可以考虑两种方式:a)在启动时手动输入密码(如果交互式运行)b)使用安全的密码管理方式(如从加密文件中读取,但需要额外设置)由于用户问题中提到了“输入密码”,我们假设是交互式输入。因此,我们需要确保以该用户身份运行命令时能够进行交互。步骤分解:步骤1:创建用户我们可以使用`useradd`命令创建用户,并设置其家目录(可选)和登录shell(如/bin/bash)。步骤2:设置目录权限将/opt/zjzy目录的所有者改为新创建的用户,或者将该用户添加到拥有该目录的组中,并设置适当的权限。步骤3:以该用户身份运行Java包使用`su`或`sudo`命令切换到该用户,并运行Java命令。但是,如果Java程序需要在前台运行并接受密码输入,我们可以使用`su-c`或`sudo-u`来运行,并保持终端交互。但是,注意:如果Java包需要输入密码,且我们希望在后台运行,那么交互式输入可能就不合适了。这里我们先按交互式运行来考虑。详细步骤:1.创建用户(需要root权限):sudouseradd-m-s/bin/bashzjzy_user#-m创建家目录,-s设置登录shell2.设置/opt/zjzy目录的权限:sudochown-Rzjzy_user:zjzy_user/opt/zjzy3.切换到新用户并运行Java包:sudo-uzjzy_userjava-jar/opt/zjzy/your_application.jar#假设是jar包但是,如果Java包在运行时会提示输入密码,那么上面的命令会等待用户在终端输入。然而,使用`sudo-u`运行命令时,标准输入是继承当前终端的,所以可以输入。如果Java包需要从标准输入读取密码,那么我们可以这样运行。但如果密码是通过图形界面输入,那么可能需要考虑图形界面的权限问题(比如X11转发权限),这里我们假设是控制台输入。如果用户希望在启动时自动输入密码(非交互式),那么需要将密码通过管道或参数传入。但这样不安全,不推荐。如果必须,可以使用`expect`脚本,但同样有安全风险。根据用户的需求,我们只要求“输入密码”,所以先按交互式处理。另外,用户可能希望每次启动时不需要输入sudo密码(因为sudo命令可能需要当前用户密码)。我们可以通过配置sudoers文件,允许当前用户以zjzy_user身份运行该Java命令而不需要密码。但是,用户问题中没有明确要求自动运行,所以我们先提供交互式运行的方法。如果用户希望这个新创建的用户只能运行这个Java程序,我们可以限制该用户的登录权限(比如不允许登录,但允许运行特定的命令)。这里我们创建用户时已经指定了shell,所以可以登录。如果不需要登录,可以设置shell为`/usr/sbin/nologin`。考虑到用户可能需要运行Java程序,我们保留bash。总结操作步骤:1.创建用户:sudouseradd-m-s/bin/bashzjzy_user2.设置密码(如果需要用户登录,但这里我们不需要用户直接登录,所以可以不设置密码?但是,如果使用`su`切换用户,需要密码。为了避免密码,我们可以使用sudo密码切换。或者,我们也可以不为该用户设置密码,这样就不能通过密码登录,但sudo可以切换。)实际上,使用`sudo-uzjzy_user`不需要该用户的密码,而是需要当前用户的sudo权限。3.修改目录权限:sudochown-Rzjzy_user:zjzy_user/opt/zjzy4.运行Java程序:sudo-uzjzy_userjava-jar/opt/zjzy/your_application.jar如果Java程序需要输入密码,那么在执行上述命令后,程序会等待输入,用户可以在终端输入密码。如果用户希望每次启动Java程序时不需要输入sudo密码(即当前用户的sudo密码),我们可以配置sudoers:使用`visudo`命令,添加一行:your_current_userALL=(zjzy_user)NOPASSWD:/usr/bin/java然后,我们可以这样运行(不需要输入当前用户的sudo密码):sudo-uzjzy_userjava-jar/opt/zjzy/your_application.jar但是,注意:上面的sudoers配置只允许运行`/usr/bin/java`,而参数(jar包路径)可以任意。这样配置后,运行java命令就不需要密码了。如果用户希望将整个操作自动化,比如写一个启动脚本,那么可以在脚本中包含上述命令。启动脚本示例(start_java.sh):#!/bin/bashsudo-uzjzy_userjava-jar/opt/zjzy/your_application.jar然后给脚本执行权限:chmod+xstart_java.sh运行脚本:./start_java.sh但是,这样运行脚本时,如果配置了sudo密码,那么就不会提示输入sudo密码;否则,会提示输入当前用户的sudo密码。另外,如果Java程序本身需要输入密码,那么脚本运行后,程序会等待用户输入。如果用户希望非交互式地提供密码给Java程序(即自动输入密码),那么就需要根据Java程序读取密码的方式(例如从参数、环境变量、文件等)来调整。但这样不安全,因此这里不展开。根据用户的需求,我们只要求能够输入密码,所以交互式输入即可。最后,注意:如果Java程序是长期运行的服务,那么可能需要使用nohup或者systemd服务来管理。这里用户只是要求启动,所以按前台启动处理。因此,我们提供以下步骤:1.创建用户(使用sudo权限):sudouseradd-m-s/bin/bashzjzy_user2.更改目录所有者:sudochown-Rzjzy_user:zjzy_user/opt/zjzy3.运行Java程序(每次运行需要sudo权限,如果不想输入sudo密码,则配置sudoers):sudo-uzjzy_userjava-jar/opt/zjzy/your_application.jar4.(可选)配置sudoers文件,使得当前用户运行该命令时不需要密码。注意:将your_application.jar替换为实际的Java包文件名。另外,如果Java程序需要其他依赖或环境变量,可能需要在新用户的环境中进行设置。可以在新用户的家目录下的.bashrc中设置,或者在运行命令时指定环境变量。例如:sudo-uzjzy_userenvJAVA_HOME=/path/to/javajava-jar...由于用户问题中没有提到环境变量,我们暂时不考虑。现在,生成相关问题。</think>### Linux 创建用户并在 `/opt/zjzy` 目录启动需密码的 Java 包 #### 1. **创建专用用户** ```bash # 创建用户 zjzy_user,禁止登录(安全隔离) sudo useradd -s /usr/sbin/nologin -M zjzy_user ``` - `-s /usr/sbin/nologin`:禁止用户登录系统,仅用于运行服务 - `-M`:不创建家目录(因服务目录在 `/opt`)[^1] #### 2. **设置目录权限** ```bash # 将 /opt/zjzy 的所有权赋予 zjzy_user sudo chown -R zjzy_user:zjzy_user /opt/zjzy # 设置目录权限(用户可读写执行,组和其他用户无权限) sudo chmod 700 /opt/zjzy ``` - **权限说明**: `700` = 用户 `rwx`,组 `---`,其他 `---` 确保只有 `zjzy_user` 可访问目录内容[^2] #### 3. **启动 Java 包并处理密码输入** 假设 Java 包名为 `app.jar`,且启动时需要从终端输入密码: ```bash # 以 zjzy_user 身份启动并保持终端交互 sudo -u zjzy_user java -jar /opt/zjzy/app.jar ``` - **交互式输入**:执行后终端会等待手动输入密码 - **安全提示**:避免在命令行直接传递密码(如 `-Dpassword=xxx`),防止泄露 #### 4. **自动化密码输入(需谨慎)** 若需非交互式启动(如脚本中),使用 `expect` 工具: ```bash # 安装 expect sudo apt-get install expect # Debian/Ubuntu sudo yum install expect # CentOS/RHEL # 创建启动脚本 start_app.exp #!/usr/bin/expect set password "your_password" # 替换为实际密码 spawn sudo -u zjzy_user java -jar /opt/zjzy/app.jar expect "Enter password:" send "$password\r" interact ``` - **风险提示**:密码明文存储在脚本中,仅限安全环境使用 - **权限设置**:限制脚本访问权限 ```bash chmod 700 start_app.exp # 仅所有者可读写执行 ``` --- ### 关键安全措施 1. **最小权限原则** - 专用用户仅拥有 `/opt/zjzy` 的权限 - 禁止登录降低攻击面[^1] 2. **目录隔离** `/opt/zjzy` 独立于系统程序,避免权限冲突(符合 FHS 标准)[^1] 3. **审计跟踪** 通过系统日志监控操作: ```bash # 查看用户相关日志 grep zjzy_user /var/log/auth.log ``` --- ### 相关问题 1. 如何安全存储 Java 应用所需的密码? 2. 在 Linux 中如何配置 Systemd 服务管理需密码的 Java 应用? 3. 如何审计特定用户在 `/opt` 目录下的文件访问记录? [^1]: `/opt` 目录通常用于第三方未打包软件,需严格权限控制(参考 FHS 标准)。 [^2]: 目录权限 `700` 确保用户独占访问,避免组或其他用户泄露密码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值