使用shell脚本访问文件内容

使用shell脚本访问文件内容

我需要从文件中获取用户和密码并在我的脚本中使用它

我的文件如下所示(netrc 是我的文件名)

machine ftp.test.net login test_user password test_pass
machine ftp1.test.net login test_user1 password test_pass1

我想编写一个函数来访问文件并获取特定机器的用户名和密码

答案1

get_netrc_user () {
    awk -v machine="$1" '$2 == machine { print $4 }' netrc
}

get_netrc_user () {
    awk -v machine="$1" '$2 == machine { print $6 }' netrc
}

第一个函数获取给定特定计算机的用户名/登录名,第二个函数获取密码。

使用方法:

username=$( get_netrc_user 'ftp.test.net' )
password=$( get_netrc_pass 'ftp.test.net' )

但假设get_netrc_pass密码不包含任何空格。如果确实如此,我们可以将其更改为更安全一点:

get_netrc_user () {
    awk -v machine="$1" '$2 == machine { sub(".*password ", "", $0); print }' netrc
}

现在,我们不再返回文件中的第 6 个空格分隔字段,而是删除字符串之前的所有内容password(末尾有一个空格)并返回该行的剩余内容。如果密码明显包含该字符串,这仍然会失败。

答案2

我会这样做:

login=$(grep $mymachin "$myfile" | cut -d' ' -f3)
password=$(grep $mymachin "$myfile" | cut -d' ' -f5)

甚至更好

# reading the file only once
login_password=$(grep $mymachin "$myfile" | cut -d' ' -f3,5)
login=$(cut -d' ' -f1 <<<$login_password)
password=$(cut -d' ' -f2 <<<$login_password)

现在我已经正确阅读了示例,使用关键字而不是位置的替代方法:

line=$(grep $mymachin "$myfile")
login=$(sed 's/.*login \(.*\) .*/\1/' <<<$line)
password=$(sed 's/.*password \(.*\) .*/\1/' <<<$line)

答案3

我将使用 cat 输出文件,grep 来选择机器,并使用 awk 来过滤字段(在您的情况下是密码等)。

所以像这样的事情

login=$(cat $myfile | grep $mymachine | awk '{print $4}')

答案4

使用以下命令完成获取用户名和密码

username=`awk '/Machinename/{print $4}' filename`
pass=`awk '/Machinename/{print $6}' filename`

相关内容