I’ve got this command in a bash script:

TEST=$(curl -o /dev/null -s -k -w "%{http_code}" -u "${USERNAME}:${PASSWORD}" "${URL}/dashboard/")
echo "${TEST}" #debug

When the script runs, the output is “000”.

When I run the same curl command from the shell, the output is “200” (which is correct, since the URL is valid).

I verified that the USERNAME, PASSWORD, and URL vars are being passed to the subshell.

I’d appreciate it if you could point out what I’m doing wrong here. :)

UPDATE: This has been solved.

    • Mike Wooskey@lemmy.thewooskeys.comOP
      link
      fedilink
      English
      arrow-up
      1
      ·
      14 days ago

      Ah!

      TEST=$(curl -o /dev/null -s -k -w "%{http_code}" -u "${USERNAME}:${PASSWORD}" "${URL}/dashboard/#/http/routers")
      echo "previous exit code: $?" #debug
      echo "${TEST}" #debug
      

      This outputs:

      previous exit code: 7
      000
      

      Is $? referring to the exit command of the curl in the subshell? Or is it referring to the assignment of the subshell’s output to the TEST var?

      • rwdf@lemmy.world
        link
        fedilink
        English
        arrow-up
        1
        ·
        14 days ago

        Exit code 7 means curl couldn’t connect to the host, so I would try just curling a URL you know is valid directly, not setting it as an env var, to see what happens then.

          • Mike Wooskey@lemmy.thewooskeys.comOP
            link
            fedilink
            English
            arrow-up
            2
            ·
            14 days ago

            I stumbled on a possible cause, but more background is necessary to explain.

            The script actually creates an ssh tunnel (to the Traefik host) and then does the curl. So the code is like:

            SSH_CMD="ssh -N -L ${LOCAL_PORT}:127.0.0.1:${REMOTE_PORT} ${REMOTE_USER}@${REMOTE_HOST}"
            $SSH_CMD &
            SSH_PID=$!
            SSH_RESULT=$?
            
            TEST=$(curl -o /dev/null -s -k -w "%{http_code}" -u "${USERNAME}:${PASSWORD}" "${URL}/dashboard/")
            echo "${TEST}" #debug
            

            What I learned is that when i run the script, the tunnel is successfully created but the curl fails; but then if I run the script again a second tunnel is created and the curl works fine.

            • rwdf@lemmy.world
              link
              fedilink
              English
              arrow-up
              1
              ·
              edit-2
              14 days ago

              Ah, I see. I guess they get different contexts or something? (Edit: I re-read your post and this does not make any sense :)) What if you chain the ssh command and the curl using &&?

              • Mike Wooskey@lemmy.thewooskeys.comOP
                link
                fedilink
                English
                arrow-up
                1
                ·
                14 days ago

                I’m not sure how to chain these 2 commands with &&, because the SSH command is being put in the background with &.

                This doesn’t work:

                SSH_CMD="ssh -N -L ${LOCAL_PORT}:127.0.0.1:${REMOTE_PORT} ${REMOTE_USER}@${REMOTE_HOST}"
                $SSH_CMD & && TEST=$(curl -o /dev/null -s -k -w "%{http_code}" -u "${USERNAME}:${PASSWORD}" "${URL}/dashboard/")
                SSH_PID=$!
                SSH_RESULT=$?
                echo $TEST
                

                Perhaps I don’t need it in the background - the goal was to establish the tunnel and then continue with the script without it hanging until the ssh command is canceled.

            • rwdf@lemmy.world
              link
              fedilink
              English
              arrow-up
              1
              ·
              14 days ago

              Are you trying to reach a URL on the same host you’re ssh-ing to? That would create some interesting effects.

              Especially since it works the second time it could mean that the second time you’re actually on the host and ssh-ing to the host itself and then curling localhost.

              • Mike Wooskey@lemmy.thewooskeys.comOP
                link
                fedilink
                English
                arrow-up
                2
                ·
                14 days ago

                That seems to have done it!

                Running the ssh -f... instead of ssh.... & seems to work first time and every time.

                It makes it so SSH_PID=$! doesn’t work, but I used pgrep -f <ssh command> instead.

                Thanks!

                • ignoble_stigmas@sh.itjust.works
                  link
                  fedilink
                  English
                  arrow-up
                  1
                  ·
                  14 days ago

                  You are very welcome! That was the hypothesis, that ssh doesn’t go into background as you want it to, since it works for the second run, but tunnel is there after the first.

          • rwdf@lemmy.world
            link
            fedilink
            English
            arrow-up
            1
            ·
            14 days ago

            Someone else suggested the env vars arent being expanded correctly inside the $(curl …), which could be the culprit … If a straight up URL works that would indicate that something like that is happening.

            That said, I just tried setting an env var called URL=“” and curling it, and curl said exit code 2, no URL specified, so something else is going on here.

        • Mike Wooskey@lemmy.thewooskeys.comOP
          link
          fedilink
          English
          arrow-up
          1
          ·
          14 days ago

          Here is the result of the script curling a known good URL (it still results in exit code 7 and thus a result of “000”), followed by a copy-paste of the curl command run in the shell (exited with “200”):

          $ ./test.sh
          curl -o /dev/null -s -k -w "%{http_code}" "https://i0.wp.com/www.notquitezen.co/wp-content/uploads/2022/07/Is-Happiness-an-Emotion.png"
          previous exit code: 7
          000
          $
          $ curl -o /dev/null -s -k -w "%{http_code}" "https://i0.wp.com/www.notquitezen.co/wp-content/uploads/2022/07/Is-Happiness-an-Emotion.png"
          200