jenkinsci / jenkinsci/workflow-basic-steps-plugin

[JENKINS-62657] Shell steps swallow ticks(') and quotes(") that are escaped

Aperta
#511 1 commento 0 reazioni 0 assegnatari Vedi su GitHub
component:workflow-basic-steps-plugin imported-jira-issue priority:minor resolution:unresolved
Lingua principale
Java
Stelle
73
Fork
129
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Descrizione

I have an issue where I was trying to run a ssh command inside of a shell step but could not preserve the ticks and quotes I needed in the command I run during the SSH. The command looked something like this:

```

sh "ssh -i $keyFile $adminUser@$Host 'sudo $command -f ${Cloud} -u ${env.USERNAME} -x ${env.PASSWORD} -s \"mountPoint=\'/admintool/1\'\" -p redeploy'"

```

The issue is that the shell script I am running $command requires that mountPoint variable to be within quotes " and the argument after the equals needs to be in ticks '.

This issue only happens on shell steps as I can echo the command correctly by replacing the above sh with echo.

Workaround: In the end I had to build a shell script on disk and just run that so something in the groovy interpretation is breaking things.

Steps to reproduce:

1. Start up a brand new Jenkins instance with Pipeline installed

2. Create a new job with the following definition:

node(){

echo """
ssh -i $PEM_KEY $USER@$MACHINE 'echo "-f Cloud -u USERNAME -x PASSWORD -s \"mountPoint=\'/admintool/1\'\" -p redeploy"'
"""

sh """
ssh -i $PEM_KEY $USER@$MACHINE 'echo "-f Cloud -u USERNAME -x PASSWORD -s \"mountPoint=\'/admintool/1\'\" -p redeploy"'
"""
}

3. Observe that the echo prints out the statememt correctly with: `"mountPoint='/admintool/1'" but the ssh command echo does not as it removes the single ticks around admintool

Thoughts:

My understanding of echo is that it is almost the same as `sh` so I am not sure why the shell step is removing the escaped characters. Maybe there is some interpretation done on `sh` I am not aware of. So if there is any way to fix this or a better workaround I am all ears

---
Originally reported by ataylor, imported from: Shell steps swallow ticks(') and quotes(") that are escaped


  • status: Open
  • priority: Minor
  • component(s): workflow-basic-steps-plugin
  • resolution: Unresolved
  • votes: 0
  • watchers: 2
  • imported: 20251215-220547

Raw content of original issue

I have an issue where I was trying to run a ssh command inside of a shell step but could not preserve the ticks and quotes I needed in the command I run during the SSH. The command looked something like this:

```
sh "ssh -i $keyFile $adminUser@$Host 'sudo $command -f ${Cloud} -u ${env.USERNAME} -x ${env.PASSWORD} -s \"mountPoint=\'/admintool/1\'\" -p redeploy'"
```

The issue is that the shell script I am running $command requires that mountPoint variable to be within quotes " and the argument after the equals needs to be in ticks '.

This issue only happens on shell steps as I can echo the command correctly by replacing the above sh with echo.

Workaround: In the end I had to build a shell script on disk and just run that so something in the groovy interpretation is breaking things.

Steps to reproduce:
1. Start up a brand new Jenkins instance with Pipeline installed
2. Create a new job with the following definition:


node(){

echo """
ssh -i $PEM_KEY $USER@$MACHINE 'echo "-f Cloud -u USERNAME -x PASSWORD -s \"mountPoint=\'/admintool/1\'\" -p redeploy"'
"""

sh """
ssh -i $PEM_KEY $USER@$MACHINE 'echo "-f Cloud -u USERNAME -x PASSWORD -s \"mountPoint=\'/admintool/1\'\" -p redeploy"'
"""
}


3. Observe that the echo prints out the statememt correctly with: `"mountPoint='/admintool/1'" but the ssh command echo does not as it removes the single ticks around admintool

Thoughts:
My understanding of echo is that it is almost the same as `sh` so I am not sure why the shell step is removing the escaped characters. Maybe there is some interpretation done on `sh` I am not aware of. So if there is any way to fix this or a better workaround I am all ears

  • environment: Jenkins version 2.138.1 but has been tested against the latest LTS and still happens

Guida per i contributori

Apri la guida per i contributori

Direzione di ricerca

Start at the Pipeline sh step and reproduce the quoted SSH command while comparing it with the echo step. Trace how the shell step handles escaped single and double quotes, then verify the behavior with a regression check; done means the SSH command preserves the quoting shown by echo.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
java, shell
Ambito
devtools
Tipo di issue
Bug
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Ferma
Chiarezza
Abbastanza chiara
Idoneità per principianti
35/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.