为什么 bash 在评估我的变量时插入了不需要的“'”?

问题描述 投票:0回答:1

我有这个脚本:

#!/bin/bash

TOKEN='faketokendgfhjkdhf'
KEYNAME="test_$(date +'%m-%Y')"
echo $KEYNAME
KEYPATH="$HOME/.ssh/${KEYNAME}"
echo $KEYPATH
SSHPHRASE="testphrase123!"

ssh-keygen -t ed25519 \
    -f  $KEYPATH \
    -C $KEYNAME \
    -N "$SSHPHRASE"

echo $KEYPATH
cat "$KEYPATH".pub
PUBKEY="$(cat $KEYPATH.pub)"
echo "$PUBKEY"

read -r -d '' SSH_KEY_REQ <<EOF
{"labels":{},\
"name":"$KEYNAME",\
"public_key":"$(echo "$PUBKEY")"}
EOF

echo $SSH_KEY_REQ

curl \
    -X POST \
    -H "Authorization: Bearer "$TOKEN"" \
    -H "Content-Type: application/json" \
    -d $SSH_KEY_REQ \
    "https://api.example.com/v1/ssh_keys"

但是,当我运行脚本时,它失败了

curl: (6) Could not resolve host: AAAAC3NzaC1lZDI1NTE5AAAAIJ88fLX9FgVC8poMyfuMFuE
curl: (3) unmatched close brace/bracket in URL position 14:
test_01-2024"}

因此,我使用

-x
运行脚本,以查看实际创建的字符串,并且似乎
'
正在被插入到
public_key
的字符串中。

$ sh -x htest.sh $PARENTPATH/Secret/variables.sh
sh -x htest.sh $PARENTPATH/Secret/variables.sh
+ TOKEN=faketokendgfhjkdhf
++ date +%m-%Y
+ KEYNAME=test_01-2024
+ echo test_01-2024
test_01-2024
+ KEYPATH=/home/jam/.ssh/test_01-2024
+ echo /home/jam/.ssh/test_01-2024
/home/jam/.ssh/test_01-2024
+ SSHPHRASE='testphrase123!'
+ ssh-keygen -t ed25519 -f /home/jam/.ssh/test_01-2024 -C test_01-2024 -N 'testphrase123!'
Generating public/private ed25519 key pair.
/home/jam/.ssh/test_01-2024 already exists.
Overwrite (y/n)? y
Your identification has been saved in /home/jam/.ssh/test_01-2024
Your public key has been saved in /home/jam/.ssh/test_01-2024.pub
The key fingerprint is:
SHA256:ycI4fnxQSo1NDiQ/lLXUcVcJrhsnsPFzkqlO8uAI6qs test_01-2024
The key's randomart image is:
+--[ED25519 256]--+
|    ..+o+.....o.o|
|     +.O ..... . |
|      = *o   .   |
|     + = .= +    |
|    o = S. X o   |
|   . o o  . O    |
|   .. oo.o .     |
|  . ..o.*        |
|E+.  . . o       |
+----[SHA256]-----+
+ echo /home/jam/.ssh/test_01-2024
/home/jam/.ssh/test_01-2024
+ cat /home/jam/.ssh/test_01-2024.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJ88fLX9FgVC8poMyfuMFuE/DFtXlaer9LY/WfHnoIOi test_01-2024
++ cat /home/jam/.ssh/test_01-2024.pub
+ PUBKEY='ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJ88fLX9FgVC8poMyfuMFuE/DFtXlaer9LY/WfHnoIOi test_01-2024'
+ echo 'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJ88fLX9FgVC8poMyfuMFuE/DFtXlaer9LY/WfHnoIOi test_01-2024'
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJ88fLX9FgVC8poMyfuMFuE/DFtXlaer9LY/WfHnoIOi test_01-2024
+ read -r -d '' SSH_KEY_REQ
++ echo 'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJ88fLX9FgVC8poMyfuMFuE/DFtXlaer9LY/WfHnoIOi test_01-2024'
+ echo '{"labels":{},"name":"test_01-2024","public_key":"ssh-ed25519' AAAAC3NzaC1lZDI1NTE5AAAAIJ88fLX9FgVC8poMyfuMFuE/DFtXlaer9LY/WfHnoIOi 'test_01-2024"}'
{"labels":{},"name":"test_01-2024","public_key":"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJ88fLX9FgVC8poMyfuMFuE/DFtXlaer9LY/WfHnoIOi test_01-2024"}
+ curl -X POST -H 'Authorization: Bearer faketokendgfhjkdhf' -H 'Content-Type: application/json' -d '{"labels":{},"name":"test_01-2024","public_key":"ssh-ed25519' AAAAC3NzaC1lZDI1NTE5AAAAIJ88fLX9FgVC8poMyfuMFuE/DFtXlaer9LY/WfHnoIOi 'test_01-2024"}' https://api.example.com/v1/ssh_keys
curl: (6) Could not resolve host: AAAAC3NzaC1lZDI1NTE5AAAAIJ88fLX9FgVC8poMyfuMFuE
curl: (3) unmatched close brace/bracket in URL position 14:
test_01-2024"}

            ^

使用

read
和/或使用定界符似乎是不需要的
'
出现的地方:

+ echo 'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJ88fLX9FgVC8poMyfuMFuE/DFtXlaer9LY/WfHnoIOi test_01-2024'
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJ88fLX9FgVC8poMyfuMFuE/DFtXlaer9LY/WfHnoIOi test_01-2024
+ read -r -d '' SSH_KEY_REQ
++ echo 'ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJ88fLX9FgVC8poMyfuMFuE/DFtXlaer9LY/WfHnoIOi test_01-2024'
+ echo '{"labels":{},"name":"test_01-2024","public_key":"ssh-ed25519' AAAAC3NzaC1lZDI1NTE5AAAAIJ88fLX9FgVC8poMyfuMFuE/DFtXlaer9LY/WfHnoIOi 'test_01-2024"}'


我不清楚这是如何/为什么会发生。我的目标是在

SSH_KEY_REQ
中使用带有未修改的 pubkey 的 json 字符串,这样
curl
命令实际运行的是:

curl -X POST -H 'Authorization: Bearer faketokendgfhjkdhf' -H 'Content-Type: application/json' -d '{"labels":{},"name":"test_01-2024","public_key":"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMu4pDny1/78PYQBcu6kPs+n2e0Jt9goIyDMqFcndFPI test_01-2024"}' https://api.example.com/v1/ssh_keys
bash variable-assignment evaluation heredoc quotation-marks
1个回答
0
投票

该字符串中实际上并没有

'
。这就是 Bash 表示传递给命令的多个参数的方式。

这是一个简化的示例来说明我的意思:

set -x

PUBKEY="TEST bar"

read -r -d '' SSH_KEY_REQ <<EOF
{"public_key":"$PUBKEY"}
EOF
echo $SSH_KEY_REQ

这将打印以下内容:

+ PUBKEY='TEST bar'
+ read -r -d '' SSH_KEY_REQ
+ echo '{"public_key":"TEST' 'bar"}'
{"public_key":"TEST bar"}

请注意,第 3 行的替换字符串中间出现了一个

'
。但是
'
并不是单独出现的 - 实际上有 4 个
'
字符。如果仔细观察示例的输出,会发现开头和结尾会发生同样的事情。

Bash 正在执行分词,因为 $SSH_KEY_REQ 没有被引用。如果您将

echo $SSH_KEY_REQ
更改为
echo "$SSH_KEY_REQ"
,它将停止将密钥分解为多个参数。

您应该记住的其他一些事情:

  • $(echo $VAR)
    是多余的,可以简化为
    $VAR
© www.soinside.com 2019 - 2024. All rights reserved.