DannyBen/jossh

View on GitHub
README.md

Summary

Maintainability
Test Coverage
Jossh - Your SSH Buddy
======================

[![Gem Version](https://badge.fury.io/rb/jossh.svg)](https://badge.fury.io/rb/jossh)
[![Maintainability](https://api.codeclimate.com/v1/badges/deea8bfb0490e6be3cf6/maintainability)](https://codeclimate.com/github/DannyBen/jossh/maintainability)


**Jossh** is

- a command line utility for running local scripts and commands over SSH.
- a ruby library for easier and prettier SSH deployment and automation.

## Install

Add to your Gemfile

    gem 'jossh'

Or install manually

    gem install jossh


## Features

1. Allows running one or more commands over SSH.
2. Allows running local scripts remotely
3. Allows running a script on multiple hosts.
4. Has four commands: `ssh`, `ssh!`, `ssh_script` and `ssh_script!`. The 'bang' versions generate pretty and indented output.
5. Uses a single SSH connection.
6. Uses a simple hash for defining hosts.
7. Allows storing host specifications in a YAML file.
8. Supports all options available in `Net::SSH#start`.
9. Prints output Heroku-style.
10. Has a command line interface - `jossh <host> <script>` 

## Command Line Usage

After installing, you can call `jossh` from the command line to run arbitrary
commands or a local script over SSH.

    $ jossh -h

    Jossh
    
    Usage:
      jossh <host> <script> [-- <arguments>...]
      jossh -m | --make-hostfile
      jossh -e | --edit-hostfile
      jossh -l | --list
      jossh -h | --help 
      jossh -v | --version
    
    Arguments:
      <host>
        can be:
        - :symbol    : in this case we will look in ./ssh_hosts.yml or ~/ssh_hosts.yml
        - host       : in this case we will use the current logged in user
        - user@host
    
      <script> 
        can be:
        - a file in the current directory
        - a file in ~/jossh directory
        - one or more direct command
    
      <arguments>...
        When specifying a filename as the <script>, you may also pass additional
        arguments to it. 
        Use $1 - $9 in your script file to work with these arguments.
        Use $@ (or $*) to use the entire arguments string
    
    Options:
      -m --make-hostfile     Generate a template ssh_hosts.yml 
      -e --edit-hostfile     Open the currently used ssh_hosts.yml file for editing
      -l --list              Show hosts in ./ssh_hosts.yml or ~/ssh_hosts.yml
      -h --help              Show this screen
      -v --version           Show version
    
    Examples: 
      jossh :production "git status"
      jossh jack@server.com "cd ~ && ls -l"
      jossh server.com deploy
      jossh server.com rake -- db:migrate

---

## Library Usage

### Example 1: Host specifications in a YAML file

```ruby
# example.rb
require 'jossh'

ssh! :localhost, ["cd /opt/app", "git pull"]
```

```yaml
# ssh_hosts.yml
:localhost:
  :host: 'localhost'
  :user: 'vagrant'
```

### Example 2: Host specifications directly in the code

```ruby
# example.rb
require 'jossh'

localhost = {
  host: 'localhost',
  user: 'vagrant',
  forward_agent: true,
}

ssh! localhost, ["cd /opt/app", "git pull"]
```


### Example 3: Run an external local script remotely

```ruby
# example.rb
require 'jossh'

ssh_script! :production, deploy
```

```bash
# deploy
cd /opt/app
echo "-> Pulling source from origin"
git pull
echo "-> Restarting server"
touch 'tmp/restart.txt'
echo "-> Done"
```

See also: The [examples folder](https://github.com/DannyBen/jossh/tree/master/examples)

## Host Specification File

When using a :symbol as the host name, Jossh will look for a YAML 
configuration file named `ssh_hosts.yml`. The file is expected to be either
in the current directory or the user's home directory.

If you wish to use a different filename or location, use the `ssh_hostfile` 
method. If you specify only a filename or a relative path, Jossh will still 
look for this file in both the current directory and user's home directory.

```ruby
# Specify exact location
ssh_hostfile "/etc/my_hosts.yml"
ssh! :myhost, 'ls'

# Look for ./configs/hosts.yml or ~/configs/hosts.yml
ssh_hostfile "configs/hosts.yml"
ssh! :myhost, 'ls'
```

You can ask Jossh to create a sample file for you by running:

    $ jossh --make-hostfile

## Working with Multiple Hosts

Define multiple hosts in the `ssh_hosts.yml` file by simply providing an array
of other keys:

```yaml
:web01:
  :host: web01.server.com
  :user: admin

:web02:
  :host: web02.server.com
  :user: admin

:production: 
  - :web01
  - :web02
```

See [ssh_hosts.example.yml](https://github.com/DannyBen/jossh/blob/master/ssh_hosts.example.yml) as an example.

## Writing Scripts

The scripts you execute with Jossh are simple shell scripts. These variables 
are available to you inside the script:

### `$1 - $9 and $@ or $*`

When running through the command line and using the 
`jossh <host> <script> -- <arguments>` syntax, these variables hold the 
arguments.

`$@` and `$*` hold the entire arguments string.

Example: 
```bash
# myscript
echo "-> Running requested rake task"
rake $@
```

And call it with:
`$ jossh :host myscript -- db:migrate`



### `%{key}`
When this syntax appears in your script, it will be replaced with any key
from the host configuration. 

Example: 
```bash
echo "-> Migrating database on %{host}"
rake db:migrate
```