ssh-locate 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cc7830c637948887cfa9eede807ab7711c35a59c01639dacfe5a91f63ac0b741
4
- data.tar.gz: 46d307a723df4ba12ad17e15281025e9267f702c18d082fbaab955de8206861c
3
+ metadata.gz: 784e22cc6152ba4f53793125ac7c02f1ce31601aa839578fa293efdd7e7a7acc
4
+ data.tar.gz: ab574c8e2d68d9b7259ce0ec9c893cda059b8582bee7af4151210e6130482f5b
5
5
  SHA512:
6
- metadata.gz: bf11790093cf5c3b403970686e605c4955768fbca8a76bb1f181f99a2e634a672cff9f433372c228729a5157aa4c1eee3ccd3131d6a1618a4f0aae791460b435
7
- data.tar.gz: 705054a24018b873d254c51ae650a167381133c5c0e68f4f4d52f2c66dc2eaf88a3ec9c3cb2b698532bd916e297886984b34258612490b1472d920544ca30675
6
+ metadata.gz: f22628c4de53289d4cc1ebe340150f249f78186667e266b12a70ddaab46ee2bd72868554c40441c539de3de0cfbdb5df708a558290291cb7f6ba7887d2aac16c
7
+ data.tar.gz: c279c4578506b0aae500f9914c3642b1a61d1bf6ffcc0bbcf8f86edec8a1160545d35ae353254c07a4dfbb0cfbb2cc5c505eeba94f9d666f5ba7765c4ea067a1
@@ -0,0 +1,35 @@
1
+ # This workflow uses actions that are not certified by GitHub.
2
+ # They are provided by a third-party and are governed by
3
+ # separate terms of service, privacy policy, and support
4
+ # documentation.
5
+ # This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake
6
+ # For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby
7
+
8
+ name: Ruby
9
+
10
+ on:
11
+ push:
12
+ branches: [ master ]
13
+ pull_request:
14
+ branches: [ master ]
15
+
16
+ jobs:
17
+ test:
18
+
19
+ runs-on: ubuntu-latest
20
+ strategy:
21
+ matrix:
22
+ ruby-version: ['2.6', '2.7', '3.0']
23
+
24
+ steps:
25
+ - uses: actions/checkout@v2
26
+ - name: Set up Ruby
27
+ # To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
28
+ # change this to (see https://github.com/ruby/setup-ruby#versioning):
29
+ # uses: ruby/setup-ruby@v1
30
+ uses: ruby/setup-ruby@473e4d8fe5dd94ee328fdfca9f8c9c7afc9dae5e
31
+ with:
32
+ ruby-version: ${{ matrix.ruby-version }}
33
+ bundler-cache: true # runs 'bundle install' and caches installed gems automatically
34
+ - name: Run tests
35
+ run: bundle exec rake
data/.travis.yml CHANGED
@@ -1,4 +1,4 @@
1
1
  rvm:
2
- - 2.6.3
3
-
4
-
2
+ - 2.6.9
3
+ - 2.7.5
4
+ - 3.1.1
data/Gemfile CHANGED
@@ -11,5 +11,6 @@ group :dev do
11
11
  gem "aruba"
12
12
  gem "guard-cucumber"
13
13
  gem "rspec-expectations"
14
+ gem "solargraph"
14
15
  end
15
16
 
data/README.md CHANGED
@@ -1,14 +1,24 @@
1
1
  ssh-locate
2
2
  ==========
3
3
  [![Build Status](https://secure.travis-ci.org/ameuret/ssh-locate.png)](http://travis-ci.org/ameuret/ssh-locate)
4
+ ![Gem](https://img.shields.io/gem/dt/ssh-locate?label=RubygemsDL&logo=ruby&logoColor=red)
5
+
6
+ A command line tool that helps you locate and contact a SSH agent launched in a separate shell.
7
+
8
+
9
+ ### Wait, what ⁉️
10
+
11
+ This tool fills a gap in the OpenSSH suite of tools.
12
+
13
+ * No way of knowing the PID of a running SSH Agent
14
+ * No way of knowing the authentication socket of a running SSH Agent
15
+ * `ssh-agent` only supports Bourne and C shells
4
16
 
5
- A command line tool that helps you locate and contact a SSH agent launched in a separate session.
6
-
7
17
  Features
8
18
  --------
9
19
  - output is fully compatible with openSSH:
10
20
 
11
- ```
21
+ ``` bash
12
22
  SSH_AUTH_SOCK=/tmp/ssh-locate-test.15970; export SSH_AUTH_SOCK;
13
23
  SSH_AGENT_PID=12427; export SSH_AGENT_PID;
14
24
  echo Agent pid 12427;
@@ -16,6 +26,20 @@ Features
16
26
 
17
27
  - supports the Fish shell
18
28
 
29
+ ``` fish
30
+ set -x SSH_AUTH_SOCK ssh-agent -a /tmp/zed
31
+ set -x SSH_AGENT_PID 1517651
32
+ ```
33
+
34
+ (See also Fish Startup below)
35
+
36
+ - shows EMACS Lisp to activate agent:
37
+
38
+ ``` emacs-lisp
39
+ (setenv "SSH_AUTH_SOCK" "/tmp/zed")
40
+ (setenv "SSH_AGENT_PID" "3216002")
41
+ ```
42
+
19
43
  Installation
20
44
  ------------
21
45
 
@@ -30,8 +54,22 @@ Launch your SSH agent and tell it to use a specific socket file with the -a opti
30
54
 
31
55
  In a later shell (or any process running for the user who owns the agent):
32
56
 
57
+ ### Bash
58
+
33
59
  $ eval `ssh-locate`
34
60
  Agent pid 13457
61
+
62
+ ### Fish
63
+
64
+ > ssh-locate | source
65
+
66
+ ### EMACS
67
+
68
+ Using the `--emacs` option will output the lisp code to set the necessary environment variables in EMACS.
69
+ Just paste this anywhere (in a scratch buffer for example) and execute `eval-last-sexp` (usually bound to C-x C-e)
70
+ with the cursor positionned at the end of each line.
71
+
72
+ ssh-locate --emacs
35
73
 
36
74
  Fish startup
37
75
  ------------
@@ -39,7 +77,7 @@ Fish startup
39
77
  You can launch and activate an agent at startup by adding this to your config.fish:
40
78
 
41
79
  ssh-agent -a /tmp/arnaud
42
- source (ssh-locate|psub -f)
80
+ ssh-locate | source
43
81
 
44
82
  Caveat
45
83
  ------
@@ -14,12 +14,13 @@ Feature: Agent IDs
14
14
  And the output should contain the correct agent PID
15
15
  And the output should contain the correct agent socket
16
16
 
17
- Scenario: No agent is running or localizable
17
+ Scenario: No agent is running or locatable
18
18
  Given no agent is running
19
19
  When I run `ssh-locate`
20
20
  Then the output should be empty
21
21
 
22
- Scenario: Locate an agent that shows its socket
22
+ @focus
23
+ Scenario: Locate an agent that shows its socket in the command line
23
24
  Given an ssh agent has been launched with a specific socket
24
25
  Given the user's shell is Bash
25
26
  When I run `ssh-locate`
@@ -29,7 +30,7 @@ Feature: Agent IDs
29
30
  And the output should contain "export SSH_AGENT_PID;"
30
31
  And the output should contain the correct agent PID
31
32
  And the output should contain the correct agent socket
32
-
33
+
33
34
  Scenario: Recognize and honor the agent managed by Ubuntu
34
35
  Given an ssh agent has been launched in my Ubuntu session
35
36
  When I run `ssh-locate`
@@ -39,7 +40,7 @@ Feature: Agent IDs
39
40
  And the output should contain "export SSH_AGENT_PID;"
40
41
  And the output should contain the correct agent PID
41
42
  And the output should contain the correct agent socket
42
-
43
+
43
44
  Scenario: Ignore agents run by someone else
44
45
  Given an ssh agent is running for another user
45
46
  And no ssh agent is running for me
@@ -54,4 +55,11 @@ Feature: Agent IDs
54
55
  And the output should contain "set -x SSH_AGENT_PID"
55
56
  And the output should contain the correct agent PID
56
57
  And the output should contain the correct agent socket
57
-
58
+
59
+ Scenario: Support EMACS
60
+ Given an ssh agent has been launched with a specific socket
61
+ When I run `ssh-locate --emacs`
62
+ Then the output should contain "(setenv \"SSH_AUTH_SOCK"
63
+ And the output should contain "(setenv \"SSH_AGENT_PID"
64
+ And the output should contain the correct agent PID
65
+ And the output should contain the correct agent socket
@@ -33,21 +33,18 @@ Then /^the output should be empty$/ do
33
33
  end
34
34
 
35
35
  Then /^the output should contain the correct agent PID$/ do
36
- assert_partial_output( @agentPID.to_s, all_output )
36
+ expect(all_output).to include @agentPID.to_s
37
37
  end
38
38
 
39
39
  Then /^the output should contain the correct agent socket$/ do
40
- assert_partial_output( @agentSocket.to_s, all_output )
40
+ expect(all_output).to include @agentSocket.to_s
41
41
  end
42
42
 
43
43
  Given("the user's shell is Fish") do
44
- pending "Should check the actual parent process. Not just the default shell setting."
45
- # passwdEntry = `getent passwd #{ENV['USER']}`
46
- # expect(passwdEntry).to match(/fish$/)
44
+ set_environment_variable('SHELL', 'fish')
47
45
  end
48
46
 
49
47
  Given("the user's shell is Bash") do
50
- pending "Should check the actual parent process. Not just the default shell setting."
51
- # passwdEntry = `getent passwd #{ENV['USER']}`
52
- # expect(passwdEntry).to match(/fish$/)
48
+ set_environment_variable('SHELL', 'bash')
53
49
  end
50
+
@@ -2,7 +2,7 @@ module Net
2
2
  module SSH
3
3
  module Locate
4
4
  # Honoring http://semver.org/
5
- VERSION = "0.3.0"
5
+ VERSION = "0.4.0"
6
6
  end
7
7
  end
8
8
  end
@@ -1,21 +1,49 @@
1
- require "net/ssh/locate/version"
2
- require "thor/group"
3
- require "sys/proctable"
1
+ require 'net/ssh/locate/version'
2
+ require 'thor/group'
3
+ require 'sys/proctable'
4
+ require 'English'
4
5
 
5
6
  module Net
6
7
  module SSH
7
8
  module Locate
8
9
  class App < Thor::Group
9
10
  include Thor::Actions
10
-
11
+ def self.banner
12
+ <<-LONGDESC
13
+ ssh-locate will search for a running ssh-agent and output the environment
14
+ variables needed to contact it.
15
+
16
+ To make sure that you're selecting the agent you launched and not the agent
17
+ launched by your Desktop Environment, you must use the -a option to specify
18
+ a socket path:
19
+
20
+ $ ssh-agent -a /tmp/zed
21
+ SSH_AUTH_SOCK=/tmp/zed; export SSH_AUTH_SOCK;
22
+ SSH_AGENT_PID=1908155; export SSH_AGENT_PID;
23
+ echo Agent pid 1908155;
24
+
25
+ Then later in another shell instance:
26
+
27
+ $ ssh-locate
28
+ SSH_AUTH_SOCK=/tmp/zed; export SSH_AUTH_SOCK;
29
+ SSH_AGENT_PID=1908155; export SSH_AGENT_PID;
30
+ echo Agent pid 1908155;
31
+ LONGDESC
32
+ end
33
+
34
+ class_option :emacs, type: :boolean, desc: 'Output EMACS LISP to execute in EMACS'
35
+
11
36
  def locate_agent
12
37
  @scanner = Scanner.new
13
38
  @scanner.scan
14
39
  end
15
-
40
+
16
41
  def print_shell_commands
17
42
  return unless @scanner.found?
18
- if usingFish?
43
+
44
+ if options[:emacs]
45
+ emacsOutput
46
+ elsif usingFish?
19
47
  fishOutput
20
48
  else
21
49
  bashOutput
@@ -23,44 +51,53 @@ module Net
23
51
  end
24
52
 
25
53
  private
26
- def usingFish?
27
- passwdEntry = `getent passwd #{ENV['USER']}`
28
- passwdEntry =~ /fish$/
29
- end
30
54
 
31
- def bashOutput
32
- print "SSH_AUTH_SOCK=#{@scanner.agentSocket};"
33
- puts "export SSH_AUTH_SOCK;"
34
- print "SSH_AGENT_PID=#{@scanner.agentPID};"
35
- puts "export SSH_AGENT_PID;"
36
- puts "echo Agent pid #{@scanner.agentPID};"
37
- end
38
-
39
- def fishOutput
40
- puts "set -x SSH_AUTH_SOCK #{@scanner.agentSocket}"
41
- puts "set -x SSH_AGENT_PID #{@scanner.agentPID}"
42
- end
55
+ def usingFish?
56
+ # TODO: This is far from perfect. Launching a secondary shell e.g. zsh from fish would
57
+ # still show the SHELL env var as /usr/bin/fish
58
+ ENV['SHELL'] =~ /fish/
59
+ end
60
+
61
+ def bashOutput
62
+ print "SSH_AUTH_SOCK=#{@scanner.agentSocket};"
63
+ puts "export SSH_AUTH_SOCK;"
64
+ print "SSH_AGENT_PID=#{@scanner.agentPID};"
65
+ puts "export SSH_AGENT_PID;"
66
+ puts "echo Agent pid #{@scanner.agentPID};"
67
+ end
68
+
69
+ def fishOutput
70
+ puts "set -x SSH_AUTH_SOCK #{@scanner.agentSocket}"
71
+ puts "set -x SSH_AGENT_PID #{@scanner.agentPID}"
72
+ end
73
+
74
+ def emacsOutput
75
+ puts "(setenv \"SSH_AUTH_SOCK\" \"#{@scanner.agentSocket}\")"
76
+ puts "(setenv \"SSH_AGENT_PID\" \"#{@scanner.agentPID}\")"
77
+ end
43
78
  end
44
-
79
+
45
80
  class Scanner
46
-
47
81
  attr_reader :agentSocket, :agentPID, :found
48
-
82
+
49
83
  def scan
50
84
  @found = false
51
- procs = Sys::ProcTable.ps.select do
85
+ procs = Sys::ProcTable.ps(smaps: false, cgroup: false).select do
52
86
  |p|
53
- (p.cmdline =~ /ssh-agent/) && !(p.cmdline =~ /--session=ubuntu/) && !(p.state=='Z')
87
+ res = p.cmdline =~ /ssh-agent/ && p.cmdline !~ /--session=ubuntu/ && p.state != 'Z'
88
+ res
54
89
  end
55
90
  return if procs.empty?
56
- p=procs.first
91
+
92
+ p = procs.first
57
93
  p.cmdline =~ /ssh-agent\s-a ([-.a-zA-Z0-9_\/]+)/
58
- return if !$~
94
+ return unless $LAST_MATCH_INFO
95
+
59
96
  @found = true
60
- @agentSocket = $1
97
+ @agentSocket = $LAST_MATCH_INFO[1]
61
98
  @agentPID = p.pid
62
99
  end
63
-
100
+
64
101
  def found?
65
102
  @found
66
103
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ssh-locate
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Arnaud Meuret
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-07-08 00:00:00.000000000 Z
11
+ date: 2022-07-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sys-proctable
@@ -48,6 +48,7 @@ executables:
48
48
  extensions: []
49
49
  extra_rdoc_files: []
50
50
  files:
51
+ - ".github/workflows/ruby.yml"
51
52
  - ".gitignore"
52
53
  - ".travis.yml"
53
54
  - Gemfile
@@ -65,7 +66,7 @@ files:
65
66
  homepage: ''
66
67
  licenses: []
67
68
  metadata: {}
68
- post_install_message:
69
+ post_install_message:
69
70
  rdoc_options: []
70
71
  require_paths:
71
72
  - lib
@@ -80,8 +81,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
80
81
  - !ruby/object:Gem::Version
81
82
  version: '0'
82
83
  requirements: []
83
- rubygems_version: 3.0.4
84
- signing_key:
84
+ rubygems_version: 3.3.7
85
+ signing_key:
85
86
  specification_version: 4
86
87
  summary: A tool (+ a Ruby lib) to locate a running SSH agent
87
88
  test_files: