开发者

How can you automate terminal commands?

I'm tired of doing this.

ssh me@somehost.com
input my password
sudo su - someuser
input my password
cd /some/working/directory
<run some commands>

Is there anyway to automate this? Do I need a special shell? or a shell emulator? can I programmatically drive the shell up to certain point then run manual commands on it?

Bonus points of it's programmed in python for extra hacking goodness

edit: All the answers below focus on the "full automation" part of the question: Where the hard part is what I highlighted above. Here is another exam开发者_如何学Cple to see if I can capture the essence.

ssh me@somehost.com
<get a shell because keys are setup>
sudo su - user_that_deploys_the_app
<input password, because we don't want to give passwordless sudo to developers>
cd env; source bin/activate
cd /path/where/ur/app/is/staging
<edit some files, restart the server, edit some more, check the logs, etc.>
exit the term


For the ssh/authentication piece, you can setup passwordless authentication by using keys. Then you can simply use ssh and a bash script to execute a series of commands in an automated fashion.

You could use Python here, but if you are executing a series of shell commands, it's probably a better idea to use a shell script, as that's precisely what they do.

Alternately, look into Fabric for your automation needs. It's Python-based, and your "recipes" are written in Python.


I'm not quite sure what you're asking, but what you're probably asking about is getting SSH working in password-less mode using public keys. The general idea is you generate an SSH keypair:

ssh-keygen -t rsa

which gives you id_rsa and id_rsa.pub. You append the contents of id_rsa.pub to the ~/.ssh/authorized_keys file of your target user, and SSH from that point on will not ask for credentials. In your example, this will work out to:

Only once

# On your source machine
ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub
# Copy this to clip board

# On somehost.com
su - someuser
# edit ~/.ssh/authorized_keys and paste what you had copied from previous step

From now on, you can now just run

ssh someuser@somehost.com "sh -c 'cd /some/dir; command.sh'"

and not be prompted for credentials.


fabric is a fine choice, as others have pointed out. there is also pexpect which might be more what you're looking for.


You can play with autoexpect. It creates expect script (script language intended to handle interaction with user). Run

autoexpect ssh me@somehost.com

followed by rest of commands. Script script.exp will be created. Please note, that exact results of input and output will be recorded by the script. If output may differ from execution to execution, you'll need to modify a bit generated script.


As Daniel pointed out you need to have a secure way of doing ssh and sudo on the boxes. Those items are universal to dealing with linux/unix boxes. Once you've tackled that you can use fabric. It's a python based tool to do automation.


You can set stuff up in your ~/.ssh/config For example:

Host somehost
    User test

See ssh_config(5) for more info.

Next, you can generate a SSH key using ssh-keygen(1), run ssh-agent(1), and use that for authentication.

If you want to run a command on a remote machine, you can just use something like:

$ ssh somehost "sh myscript.sh ${myparameter}".

I hope this at least points you in the right direction :)

If you need sudo access, then there are obvious potential security issues though ... You can use ChrootDirectory on a per user basis inside a Match block though. See sshd_config(5) for info.


try module paramiko. This can meet your requirement.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜