5.15. Password

本文介绍Linux系统中通过编辑/etc/login.defs文件配置用户密码策略、UID/GID范围、用户组管理等;并通过newusers批量创建用户,使用chpasswd批量更新用户密码的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

5.15.1. Shadow password suite configuration.

# cat /etc/login.defs
# *REQUIRED*
#   Directory where mailboxes reside, _or_ name of file, relative to the
#   home directory.  If you _do_ define both, MAIL_DIR takes precedence.
#   QMAIL_DIR is for Qmail
#
#QMAIL_DIR      Maildir
MAIL_DIR        /var/spool/mail
#MAIL_FILE      .mail

# Password aging controls:
#
#       PASS_MAX_DAYS   Maximum number of days a password may be used.
#       PASS_MIN_DAYS   Minimum number of days allowed between password changes.
#       PASS_MIN_LEN    Minimum acceptable password length.
#       PASS_WARN_AGE   Number of days warning given before a password expires.
#
PASS_MAX_DAYS   99999
PASS_MIN_DAYS   0
PASS_MIN_LEN    5
PASS_WARN_AGE   7

#
# Min/max values for automatic uid selection in useradd
#
UID_MIN                   500
UID_MAX                 60000

#
# Min/max values for automatic gid selection in groupadd
#
GID_MIN                   500
GID_MAX                 60000

#
# If defined, this command is run when removing a user.
# It should remove any at/cron/print jobs etc. owned by
# the user to be removed (passed as the first argument).
#
#USERDEL_CMD    /usr/sbin/userdel_local

#
# If useradd should create home directories for users by default
# On RH systems, we do. This option is overridden with the -m flag on
# useradd command line.
#
CREATE_HOME     yes

# The permission mask is initialized to this value. If not specified,
# the permission mask will be initialized to 022.
UMASK           077

# This enables userdel to remove user groups if no members exist.
#
USERGROUPS_ENAB yes

# Use MD5 or DES to encrypt password? Red Hat use MD5 by default.
MD5_CRYPT_ENAB yes

ENCRYPT_METHOD MD5

		

5.15.2. newusers - update and create new users in batch

# cat userfile.txt
www00:x:520:520::/home/www00:/sbin/nologin
www01:x:521:521::/home/www01:/sbin/nologin
www02:x:522:522::/home/www02:/sbin/nologin
www03:x:523:523::/home/www03:/sbin/nologin
www04:x:524:524::/home/www04:/sbin/nologin
www05:x:525:525::/home/www05:/sbin/nologin
www06:x:526:526::/home/www06:/sbin/nologin
www07:x:527:527::/home/www07:/sbin/nologin
www08:x:528:528::/home/www08:/sbin/nologin
www09:x:529:529::/home/www09:/sbin/nologin

# newusers userfile.txt
		

5.15.3. chpasswd - update passwords in batch mode

echo "user:password" | chpasswd

[root@dev1 ~]# adduser test
[root@dev1 ~]# echo "test:123456" | chpasswd
		

# cat passwd.txt
neo:neopass
jam:jampass

# cat passwd.txt | chpasswd
		
		
# chpasswd -c < passwd.txt
		
		

passwd 命令实现相同功能

echo "mypasword" | passwd –stdin neo





原文出处:Netkiller 系列 手札
本文作者:陈景峯
转载请与作者联系,同时请务必标明文章原始出处和作者信息及本声明。

<think>我们正在处理一个关于QSsh库中SshConnectionParameters的password赋值导致段错误的问题。根据用户描述,他们在尝试给`QSsh::SshConnectionParameters`对象的`password`字段赋值时遇到了段错误(SIGSEGV)。段错误通常是由于访问了无效的内存地址(如空指针解引用)或试图修改只读内存区域等原因引起的。 根据引用[4]中提到的SIGSEGV信号描述:无效的内存引用。这意味着在赋值操作中,可能`params`对象本身是无效的(例如空指针)或者`password`字段所在的内存区域不可写。 让我们分析可能的原因和解决方案: ### 1. **`params`对象未正确初始化** 如果`QSsh::SshConnectionParameters`对象是通过指针访问的,而该指针未初始化(即为空指针)或已被释放,那么访问其成员就会导致段错误。 示例错误代码: ```cpp QSsh::SshConnectionParameters *params = nullptr; // 未初始化 params->password = "your_password"; // 解引用空指针,导致SIGSEGV ``` 正确做法: ```cpp QSsh::SshConnectionParameters params; // 栈上对象 params.password = "your_password"; // 正确赋值 // 或者使用动态分配 QSsh::SshConnectionParameters *params = new QSsh::SshConnectionParameters; params->password = "your_password"; // 使用后记得释放 ``` ### 2. **`params`对象被提前销毁** 如果`params`对象是在某个作用域内创建的,但在使用之前已经销毁,那么访问它将导致段错误。 示例: ```cpp QSsh::SshConnectionParameters *createParams() { QSsh::SshConnectionParameters params; return &params; // 返回局部变量的地址,函数返回后params被销毁 } // 调用 QSsh::SshConnectionParameters *params = createParams(); params->password = "your_password"; // 访问已销毁的对象,导致段错误 ``` 解决方案:确保对象的生命周期足够长。可以使用动态分配(并注意释放)或者将对象定义在合适的生命周期范围内(如作为类的成员变量)。 ### 3. **`password`字段本身的特殊性质** 虽然不太常见,但有可能`password`字段是一个特殊类型(如Qt的内部指针类型),并且赋值方式不正确。但根据QSsh的常规用法,`password`是`QString`类型,可以直接赋值。 检查赋值操作是否正确: ```cpp QSsh::SshConnectionParameters params; params.password = QString("your_password"); // 显式使用QString ``` ### 4. **多线程访问问题** 如果在多个线程中同时访问同一个`params`对象,并且没有进行同步保护,可能会导致内存状态不一致,进而引发段错误。 解决方案:使用互斥锁(QMutex)保护对`params`对象的访问。 ### 5. **QSsh库的内部缺陷** 如果以上情况都排除,那么可能是QSsh库本身的问题。例如,在构造`SshConnectionParameters`对象时,内部状态未正确初始化,导致后续赋值时出现问题。 可以尝试检查QSsh库的版本,并查看是否有已知的问题。或者尝试使用其他成员赋值,看是否只有`password`字段有问题。 ### 调试建议 1. **使用调试器定位崩溃点**: 在调试模式下运行程序,当段错误发生时,查看调用堆栈,确定崩溃发生在哪一行代码。 2. **检查指针有效性**: 在赋值前,检查`this`指针(如果是成员函数)或`params`指针是否有效。 3. **Valgrind工具**: 使用Valgrind(Linux)或类似的内存检测工具运行程序,可以检测到无效的内存访问。 4. **最小化复现代码**: 尝试写一个最小的测试程序,只包含创建`SshConnectionParameters`和赋值操作,看是否还能复现问题。 5. **查看QSsh源码**: 如果有条件,查看QSsh库的源码,了解`SshConnectionParameters`的实现,特别是`password`成员。 根据引用[3]中提到的tombstone文件(Android系统)或core dump(Linux系统)分析,可以获取崩溃时的详细信息,包括崩溃的地址、寄存器状态和调用堆栈。这对于定位问题非常有帮助。 总结:段错误发生在给`password`赋值,最可能的原因是`params`对象本身无效(空指针或已释放)。请检查对象的创建和生命周期管理。 §§相关问题§§ 1. QSsh::SshConnectionParameters对象的生命周期如何管理? 2. 如何调试Qt程序中的段错误(SIGSEGV)? 3. QSsh库中密码字段的安全处理方式有哪些? 4. 多线程环境下如何安全使用QSsh库?</think>### 分析QSsh::SshConnectionParameters密码赋值导致段错误(SIGSEGV) 根据引用[4]的描述,SIGSEGV表示**无效内存引用**,通常发生在访问未初始化指针、已释放内存或只读内存区域时。结合QSsh库的特性,以下是可能原因和解决方案: --- ### 根本原因分析 1. **对象未初始化**(最常见) ```cpp QSsh::SshConnectionParameters params; // 未初始化完整对象 params.password = "pass"; // 访问无效内存 ``` - 未调用构造函数或错误使用指针时发生 2. **内存提前释放** ```cpp auto* params = new QSsh::SshConnectionParameters(); delete params; // 内存已释放 params->password = "pass"; // SIGSEGV ``` 3. **线程安全问题** - 在多线程中修改同一对象未加锁 4. **QSsh内部状态异常** - 库未正确初始化或存在版本兼容问题 --- ### 解决方案 #### ✅ 1. 确保对象正确初始化 ```cpp // 正确方式:栈对象 QSsh::SshConnectionParameters params; params.host = "example.com"; params.userName = "user"; params.password = "pass"; // 安全赋值 // 正确方式:堆对象 auto params = new QSsh::SshConnectionParameters(); params->password = "pass"; // 使用后需 delete ``` #### ✅ 2. 检查生命周期(关键) ```cpp void connectSSH() { QSsh::SshConnectionParameters params; setupParams(params); // ✔️ 传引用安全 auto* ptr = new QSsh::SshConnectionParameters; ptr->password = "pass"; // ✔️ // 必须确保在合适位置 delete ptr } // 危险示例:返回局部对象指针 QSsh::SshConnectionParameters* createParams() { QSsh::SshConnectionParameters params; return &params; // ❌ 返回后对象销毁 } ``` #### ✅ 3. 线程安全保护 ```cpp // 共享对象需加锁 QMutex paramsMutex; QSsh::SshConnectionParameters sharedParams; void updatePassword() { QMutexLocker locker(&paramsMutex); sharedParams.password = "new_pass"; // 安全 } ``` #### ✅ 4. 验证QSsh环境 1. **检查库初始化**: ```cpp #include <QSsh> QCoreApplication app(argc, argv); // Qt事件循环必须存在 ``` 2. **版本兼容性**: - 确认QSsh库与Qt版本匹配(如Qt5.15需QSsh 2.0+) --- ### 调试步骤 1. **获取崩溃堆栈**(引用[3]): ```bash gdb ./your_app core.dump bt full # 查看完整堆栈 ``` 2. **Valgrind检测**: ```bash valgrind --tool=memcheck ./your_app ``` 3. **地址消毒剂(ASAN)**: ```bash qmake CONFIG+=asan make && ./your_app ``` --- ### 典型修复案例 ```cpp // 修复前:错误使用指针 QSsh::SshConnectionParameters* params = nullptr; params->password = "crash"; // SIGSEGV // 修复后:正确初始化 QSsh::SshConnectionParameters params; params.authenticationType = QSsh::SshConnectionParameters::AuthenticationTypePassword; params.password = "safe_password"; // ✔️ ``` > **关键点**:QSsh要求先设置`authenticationType`为`AuthenticationTypePassword`才能安全使用password字段[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值