![使用本地计算机上指定的 shell 变量在远程服务器上执行文本处理任务](https://linux22.com/image/211877/%E4%BD%BF%E7%94%A8%E6%9C%AC%E5%9C%B0%E8%AE%A1%E7%AE%97%E6%9C%BA%E4%B8%8A%E6%8C%87%E5%AE%9A%E7%9A%84%20shell%20%E5%8F%98%E9%87%8F%E5%9C%A8%E8%BF%9C%E7%A8%8B%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E6%89%A7%E8%A1%8C%E6%96%87%E6%9C%AC%E5%A4%84%E7%90%86%E4%BB%BB%E5%8A%A1.png)
我正在尝试编写一个 shell 脚本,通过 SSH 处理远程服务器上的用户信息。脚本将交互读取要处理的用户。
我当前的尝试看起来像这样
#!/bin/bash echo "Enter username which u want to add" read Student3 ssh root@serverIP "useradd $Student3;" awk -F: '{print $1, $3, $6, $7}' /etc/passwd | grep "^${Student3}"
它会创建空输出。
如果没有调用
grep
,输出是root 0 /root /bin/bash bin 1 /bin /sbin/nologin daemon 2 /sbin /sbin/nologin adm 3 /var/adm /sbin/nologin lp 4 /var/spool/lpd /sbin/nologin sync 5 /sbin /bin/sync shutdown 6 /sbin /sbin/shutdown halt 7 /sbin /sbin/halt mail 8 /var/spool/mail /sbin/nologin operator 11 /root /sbin/nologin
将
grep
调用附加为 后| grep "^${Student3}"
,我得到空输出。
答案1
您希望添加的用户出现在本地/etc/passwd
.如果是上面的文件偏僻的系统,你想用 解析awk
,那么你需要使用ssh
来访问数据:
#!/bin/bash
read -r -p 'Username: ' user
# Add user and check the remote /etc/passwd file
ssh remote "useradd '$user' && cat /etc/passwd" |
awk -F : -v user="$user" '$1 == user { print $1, $3, $6, $7 }'
最后一个管道也可以写成
ssh remote "useradd '$user' && getent passwd '$user'" |
awk -F : '{ print $1, $3, $6, $7 }'
请注意,您不太可能希望使用/etc/passwd
正则表达式来解析数据,^$user
因为这会匹配用户名以$user
.上面代码的两种变体通过不使用正则表达式匹配而是对完整用户名进行字符串比较来避免这种情况。