简体   繁体   中英

How to pass password as an argument to a shell script

I am in process of automating installation of sage through ansible-playbook. In that I need to run two shell scripts. Here is how the first shell script look:

#!/bin/bash
# Creating Sage notebook

dir="/root/.sage/sage_notebook.sagenb"
screen -S "Sage_Server" sage -c 'notebook(interface="", directory=$dir, port=80, accounts=true)'

This is the second shell script's code:

#!/bin/bash
# Creating Sage inotebook

address=$(hostname --ip-address)
sage -c "inotebook(interface=" "'$address'" ",port=80,accounts=true)"

And this is how the playbook looks:

---
- hosts: localhost
  remote_user: root

  tasks:
   - name : update system
     apt : update_cache=yes    

   - name : install m4
     apt : name=m4 state=present

   - name : install build-essential
     apt : name=build-essential state=present 

   - name : install gcc
     apt : name=gcc state=present

   - name : install gfortran
     apt : name=gfortran state=present

   - name : install libssl-dev
     apt : name=libssl-dev state=present

   - name : install python-software-properties
     apt : name=python-software-properties state=present

   - name : add sage ppa repo
     apt_repository: repo='ppa:aims/sagemath'

   - name : update system
     apt : update_cache=yes

   - name : install dvipng
     apt : name=dvipng state=present

   - name : install sage binary
     apt : name=sagemath-upstream-binary state=present

   - name : invoke create_sagenb script
     command: /usr/bin/screen -d -m sudo /root/databases-and-datamining-iiith/python-scripts/create_sagenb -i -y

   - name : invoke start_sage script
     command: /usr/bin/screen -d -m sudo /root/databases-and-datamining-iiith/python-scripts/start_sage -i -y

Now when I run the first script, it asks for a new sage password which could be anything. But I am not able to pass that password from the playbook. Still, if I do

ps -ef | grep sh

I could see that the scripts are running but the sage service is not running. It needs the password in order to start the service.

Could anyone please tell me how can I provide password as an argument to the shell scripts through command.

As a rule of thumb you shouldn't run scripts that needs user input in ansible playbooks.

You could try to use something like

echo "password" | script.sh

or

Create a sage-password file in /etc containing the password and:

script.sh < /etc/sage-password

But this will only work if it is reading from stdin - most applications read password directly from terminal device driver (ie /dev/ttyS # ), in that case this trick won't work.

If that's the case, take a look to the sage docs, they should have a more robust way for non-interactive startup.

我不知道sage ,也不知道如何以另一种方式提供密码,但是如果程序要求输入密码,那么你可能expect按照这里的建议使用密码。

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM