【问题标题】:Substitute command into remote sed command将命令替换为远程 sed 命令
【发布时间】:2016-06-02 02:44:52
【问题描述】:

我想编写一个 Unix 命令,从 /etc/passwd 中选择一个随机用户,并使用 SHH 检查远程主机以确定是否存在具有相同 UID 的用户,如果该用户存在,则从 passwd 打印出整行。

这是我目前写的命令:

echo `shuf -n 1 /etc/passwd | cut -d ":" -f 3' | ssh 100.64.0.2  sed -n -e '/**xargs**/p' /etc/passwd

似乎 sed 命令不将 xargs 作为本地机器的参数,而是文本

任何想法将不胜感激!

【问题讨论】:

  • xargs 是一个命令而不是一个魔术字符串,意思是“来自输入的值”。
  • 你为什么不把整个 etc/passwd 拿来和本地的比较一下呢?它并不是真的更慢而且更安全

标签: linux bash unix sed command-substitution


【解决方案1】:

认为你试图写这样的东西

user=$(shuf -n 1 /etc/passwd | cut -d ":" -f 3)
ssh 100.64.0.2  sed -n -e "/$user/p" /etc/passwd

但您可能还想考虑改用getent

user=$(shuf -n 1 /etc/passwd | cut -d ":" -f 3)
ssh 100.64.0.2  getent passwd "$user"

正如我在对 OP 的评论中所说,xargs 是一个命令。从标准输入读取一个值并将其粘贴在命令行上并不是什么神奇的事情。 (请注意,即使作为一个概念,它也存在排序问题,因为根据定义,命令行是在任何标准输入可能存在之前构建的。)

【讨论】:

  • ssh 100.64.0.2 $(shuf -n 1
  • 你写的东西对一个人来说是多余的,而且会自行消退。检查你的逻辑,我为你修好了。 =)
  • @A.Danischewski 您正在将随机系统用户的 UID 作为命令传递给远程系统。这根本与用户提出的问题或什至是有效的事情有什么关系?我的例子“自我解除”呢?是的,您当然可以避免使用 $user 变量,但在这种情况下几乎没有理由这样做,并且使用变量可以更清楚地区分本地命令和远程命令。
  • 当您执行 shuf -n 1 /etc/passwd 时,您会在获得第三个密码后从 passwd 中得到一行类似 mail:x:8:8:mail:/var/mail:/bin/sh在这种情况下输入 UID 8 - 在你执行 ssh 并通过 getent passwd "$user" 之后 - 首先你需要像 ssh 100.64.0.2 $(getent passwd "$user") 那样编写它,其次如果你getent passwd "$user" with 8 是否会从您以 mail:x:8:8:mail:/var/mail:/bin/sh 开始的 passwd 文件中返回完整字符串
  • 这更有意义,但在第一个 ssh 中,sed 将在任何地方返回匹配项,因此您可能只想将其归为第三个字段:例如。 ssh 100.64.0.2 sed -e -n "/^[^]*:[^]*:$user:/p" /etc/passwd
【解决方案2】:
for f in `cat hostlist.txt`; do echo "### $f ###";  ssh $f find / -name "tmp" | sed "s/^/'$f  | '/" ;  done 2>/dev/null

我很难为 find 命令的每一行打印主机名,这有助于解决。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 2017-04-16
    • 2022-01-10
    • 2019-02-11
    相关资源
    最近更新 更多