我正在尝试连接到 Linux 服务器并执行一些命令。下面是它的代码片段和输出。我想将“ls”的输出分配给一个变量,以便我可以进一步处理它。让我知道怎么做?
USERNAME=root
PASSWD=abc
HOST=1.2.3.4
SCRIPT="cd /tmp/sample/; ls"
cmd="ssh -l $USERNAME $HOST $SCRIPT"
$cmd
输出:列出如下目录。
5
6
7
10
12
我正在尝试连接到 Linux 服务器并执行一些命令。下面是它的代码片段和输出。我想将“ls”的输出分配给一个变量,以便我可以进一步处理它。让我知道怎么做?
USERNAME=root
PASSWD=abc
HOST=1.2.3.4
SCRIPT="cd /tmp/sample/; ls"
cmd="ssh -l $USERNAME $HOST $SCRIPT"
$cmd
输出:列出如下目录。
5
6
7
10
12
如果您确实需要使用 bash进行此过程替换是一种选择。请注意,下面的解决方案不会将ls
输出存储在单个变量中,它会逐行处理输出
#!/usr/bin/env bash
USERNAME=******
PASSWD=********
HOST=127.0.0.1
SCRIPT="cd /tmp/; ls"
cmd="ssh -l $USERNAME $HOST $SCRIPT"
while IFS= read -r line
do
echo "$line"
done< <($cmd)
这对我来说并不整洁:
SCRIPT="cd /tmp/sample/; ls"
cmd="ssh -l $USERNAME $HOST $SCRIPT"
像这样混合使用本地和远程命令有时会导致误解。
如果你可以使用 bash,更好的方法是使用数组:
SCRIPT="cd /tmp/sample/; ls"
CMD=(ssh -l "$USERNAME" "$HOST" "$SCRIPT")
OUTPUT=$("${CMD[@]}")
echo "$OUTPUT"
如果您愿意,可以将输出另存为行数组:
SCRIPT="cd /tmp/sample/; ls"
CMD=(ssh -l "$USERNAME" "$HOST" "$SCRIPT")
readarray -t OUTPUT < <("${CMD[@]}")
for A in "${OUTPUT[@]}"; do
echo "$A"
done
附加说明:ls
足够明智地检测是否必须根据输出逐行填充文件,但某些版本不是。如果是这种情况,请添加选项-1
。