如何确保使用Ubuntu SSH在路径上正确找到应用程序

时间:2018-09-03 08:16:30

标签: bash ssh .profile

上下文

我有一个Shell脚本,可以通过SSH从Jenkins远程调用它。如果我手动SSH到用户帐户,然后运行脚本,它将起作用。但是,当Jenkins执行此操作(使用相同的用户帐户,但将命令作为SSH命令的参数执行)时,它将无法在路径上找到应用程序。

环境

  

lsb_release -a   没有可用的LSB模块。   发行人ID:Ubuntu   说明:Ubuntu 16.04.5 LTS   发行:16.04   代号:xenial

     

uname-a Linux 4.4.0-1066-aws#76-Ubuntu SMP Thu Aug 16 16:21:21 UTC 2018 x86_64 x86_64 x86_64 GNU / Linux

主目录的内容

ls -la
total 76
drwxr-xr-x 7 app  app   4096 Sep  3 07:49 .
drwxr-xr-x 4 root root  4096 Aug 19 14:31 ..
-rw------- 1 app  app  12235 Sep  3 07:52 .bash_history
drwx------ 3 app  app   4096 Aug 28 17:06 .cache
drwx------ 2 app  app   4096 Aug 22 16:07 .docker
-rw-rw-r-- 1 app  app   6064 Sep  1 15:19 docker-compose.yml
drwx------ 4 app  app   4096 Aug 22 14:37 .local
drwxrwxr-x 2 app  app   4096 Aug 28 17:15 .nano
-rw-rw-r-- 1 app  app     97 Aug 22 16:00 .profile
-rwxrw-r-- 1 app  app    177 Aug 28 07:45 run-all-apps.sh
-rwxrw-r-- 1 app  app    476 Aug 28 07:45 run-apps.sh
-rw-rw-r-- 1 app  app     66 Aug 28 17:15 .selected_editor
drwx------ 2 app  app   4096 Sep  3 07:49 .ssh
-rw------- 1 app  app  10496 Sep  3 07:49 .viminfo

.profile的内容:

cat .profile 
# set PATH so it includes user's private bin directories
PATH="$HOME/bin:$HOME/.local/bin:$PATH"

失败脚本的内容

cat ./run-apps.sh 
#!/bin/bash
set -euo pipefail
IFS=$'\n\t'

# Authenticate for ECR
eval $(aws ecr get-login --region eu-west-1 --no-include-email)

脚本的运行方式

在Jenkins文件中,我们有以下内容:

sshagent(credentials: ['server-ssh']) {
                        sh "ssh -o StrictHostKeyChecking=no -p 22 -l app ${ENVIRONMENT_HOST_NAME} './run-apps.sh'"
}

运行脚本的观察结果

  

./ run-apps.sh:第12行:aws:未找到命令

其他信息

如果我使用Jenkins使用的同一用户SSH到服务器,则可以运行AWS CLI:

whoami
app

which aws
/home/app/.local/bin/aws

最后:

aws --version
aws-cli/1.15.83 Python/2.7.12 Linux/4.4.0-1066-aws botocore/1.10.82

这可能与使用eval和环境没有传播有关吗,例如.profile未运行,因此该应用程序不在路径上。

0 个答案:

没有答案