使用本地计算机上指定的 shell 变量在远程服务器上执行文本处理任务

Use*_*49B 0 bash remote shell-script text-processing

我正在尝试编写一个 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}"
    
    Run Code Online (Sandbox Code Playgroud)

    它会创建空输出。

  • 如果没有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
    
    Run Code Online (Sandbox Code Playgroud)
  • grep调用附加为 后| grep "^${Student3}",我得到空输出。

Kus*_*nda 5

您希望添加的用户出现在本地/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 }'
Run Code Online (Sandbox Code Playgroud)

最后一个管道也可以写成

ssh remote "useradd '$user' && getent passwd '$user'" |
awk -F : '{ print $1, $3, $6, $7 }'
Run Code Online (Sandbox Code Playgroud)

请注意,您不太可能希望使用/etc/passwd正则表达式来解析数据^$user,因为这会匹配用户名以$user. 上面代码的两种变体通过不使用正则表达式匹配而是对完整用户名进行字符串比较来避免这种情况。