我正在尝试创建一个脚本,该脚本将自动将我登录到特定的远程设备(我们称其为fw)。 “命令”有些复杂,因为我们是从受保护的网络服务器登录的,有数百个要登录。
我已经创建了一个文件,其中有两个参数(命令和名称),这些文件用“#”分隔,我要的第一个参数是带有空格(例如:“ sudo --user ....”)的“命令”字符串。将(回显)到名为“ name”(我要登录的设备的名称)的可执行文件中。
我的逻辑原本是:
for line in $(awk -F# '{print $1, $2}' list.txt), do touch $2; && echo "$1 > $2" && chmod +x $2; done
我的终端应该创建x个名为“ $ name”的文件,每个文件只有一个单行命令“ $ command”,并且是“可执行的”。
我已经尝试了几种方法来使这项工作生效。我可以使用for
,while
甚至是[[ -n $name ]]
来迭代文件,但没有太多问题,但是,这仅为我提供了一个变量,而没有将行分为两部分我需要"$command"
和"$name"
。就我的目的而言,即使$1
和$2
也可以...
同时进行测试:
$ while IFS=# read -r line; do echo "$line"; done < list
sudo --user xxxxxxxxxxxxxx#yyyyyyyyy
sudo --user xxxxxxxxxxxxxx#yyyyyyyyy
sudo --user xxxxxxxxxxxxxx#yyyyyyyyy
即使使用IFS =#拆分$ line,也不会按预期方式删除“#”。
用于循环:
$ for line in $(cat list); do echo $line; done
sudo --user xxxxxxxxxxxxxx
yyyyyyyyy
sudo --user xxxxxxxxxxxxxx
yyyyyyyyy
sudo --user xxxxxxxxxxxxxx
yyyyyyyyy
尝试扩展到:
bin$ for line in $(cat list); do awk -F# '{print $1, $2}' $line; done
awk: fatal: cannot open file ` xxxxxxxxxxxxxxxxx' for reading (No such file or directory)
awk: fatal: cannot open file `yyyyyyyyy
sudo --user xxxxxxxxxxxxxxxxx' for reading (No such file or directory)
awk: fatal: cannot open file `yyyyyyyyy
sudo --user xxxxxxxxxxxxxxxxx' for reading (No such file or directory)
我想解析(循环)该文件-分离参数并在$ command中创建$ name并在chmod + x $ name中创建一个可执行文件,该文件将自动登录到“ $ name”节点。 / p>
答案 0 :(得分:1)
我建议将您所有的逻辑插入awk
脚本中。
script.awk
BEGIN {FS = "[\r#]"} # set field separator to # or <CR>
{ # for each input line
print $1 > $2; # write input 1st field to file named 2nd field
system("chmod a+x "$2); # set file named 2nd field, to be executable
}
运行脚本:
awk -f script.awk list.txt
输入list.txt
sudo --user xxxxxxxxxxxxxx#yyyyyyyy1
sudo --user xxxxxxxxxxxxxx#yyyyyyyy2
sudo --user xxxxxxxxxxxxxx#yyyyyyyy3
输出:
dudi@DM-840$ ls -l yy*
total 3
-rwxrwxrwx 1 dudi dudi 28 Jun 23 01:21 yyyyyyyy1*
-rwxrwxrwx 1 dudi dudi 28 Jun 23 01:21 yyyyyyyy2*
-rwxrwxrwx 1 dudi dudi 28 Jun 23 01:21 yyyyyyyy3*
更新:
更改了FS
以包含<CR>
字符,否则附加到文件名(称为^M
)。