mirror of
				https://github.com/ohmyzsh/ohmyzsh.git
				synced 2024-05-11 05:55:17 +00:00 
			
		
		
		
	Add shell-proxy plugin (#8692)
				
					
				
			This commit is contained in:
		
							
								
								
									
										52
									
								
								plugins/shell-proxy/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								plugins/shell-proxy/README.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,52 @@
 | 
			
		||||
# Shell Proxy oh-my-zsh plugin
 | 
			
		||||
 | 
			
		||||
This a pure user-space program, shell-proxy setter, written Python3 and Bash.
 | 
			
		||||
 | 
			
		||||
100% only no side-effects, only effect **environment variables** and **aliases**
 | 
			
		||||
 | 
			
		||||
## Key feature
 | 
			
		||||
 | 
			
		||||
- Support Ubuntu, Archlinux, etc (Linux)
 | 
			
		||||
- Support macOS
 | 
			
		||||
- Support git via based-`$GIT_SSH`
 | 
			
		||||
- Support ssh, sftp, scp, slogin and ssh-copy-id via based-`alias`
 | 
			
		||||
- Built-in Auto-complete
 | 
			
		||||
 | 
			
		||||
## Usage
 | 
			
		||||
 | 
			
		||||
Method 1:
 | 
			
		||||
 | 
			
		||||
`$DEFAULT_PROXY` is the proxy URL you will set
 | 
			
		||||
 | 
			
		||||
Method 2:
 | 
			
		||||
 | 
			
		||||
Write a program to `$HOME/.config/proxy` in the file.
 | 
			
		||||
 | 
			
		||||
Example program:
 | 
			
		||||
 | 
			
		||||
```bash
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
# The file path: $HOME/.config/proxy
 | 
			
		||||
if [[ "$OSTYPE" == "darwin"* ]]; then
 | 
			
		||||
  echo "http://127.0.0.1:6152" # Surge Mac
 | 
			
		||||
else
 | 
			
		||||
  echo "http://127.0.0.1:8123" # polipo
 | 
			
		||||
fi
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Method 3:
 | 
			
		||||
 | 
			
		||||
The working path of **Method 2** can be changed via `$CONFIG_PROXY`
 | 
			
		||||
 | 
			
		||||
## Reference
 | 
			
		||||
 | 
			
		||||
- `$GIT_SSH`: <https://www.git-scm.com/docs/git#Documentation/git.txt-codeGITSSHcode>
 | 
			
		||||
- OpenSSH manual: <https://man.openbsd.org/ssh>
 | 
			
		||||
 | 
			
		||||
## Maintainer
 | 
			
		||||
 | 
			
		||||
- <https://github.com/septs>
 | 
			
		||||
 | 
			
		||||
## The oh-my-zsh plugin (shell-proxy)
 | 
			
		||||
 | 
			
		||||
Public Domain
 | 
			
		||||
							
								
								
									
										72
									
								
								plugins/shell-proxy/proxy.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										72
									
								
								plugins/shell-proxy/proxy.py
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,72 @@
 | 
			
		||||
#!/usr/bin/env python3
 | 
			
		||||
import os
 | 
			
		||||
import sys
 | 
			
		||||
from subprocess import check_output, list2cmdline
 | 
			
		||||
 | 
			
		||||
cwd = os.path.dirname(__file__)
 | 
			
		||||
ssh_agent = os.path.join(cwd, "ssh-agent.py")
 | 
			
		||||
user_proxy = os.environ.get("CONFIG_PROXY", os.path.expandvars("$HOME/.config/proxy"))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def get_http_proxy():
 | 
			
		||||
    if "DEFAULT_PROXY" in os.environ:
 | 
			
		||||
        return os.environ["DEFAULT_PROXY"]
 | 
			
		||||
    if os.path.isfile(user_proxy):
 | 
			
		||||
        return check_output(user_proxy).decode("utf-8").strip()
 | 
			
		||||
    raise Exception("Not found, Proxy configuration")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def make_proxies(url: str):
 | 
			
		||||
    proxies = {"%s_PROXY" % _: url for _ in ("HTTP", "HTTPS", "FTP", "RSYNC", "ALL")}
 | 
			
		||||
    proxies.update({name.lower(): value for (name, value) in proxies.items()})
 | 
			
		||||
    proxies["GIT_SSH"] = ssh_agent
 | 
			
		||||
    return proxies
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def merge(mapping: dict):
 | 
			
		||||
    return ("%s=%s" % _ for _ in mapping.items())
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class CommandSet:
 | 
			
		||||
    proxies = make_proxies(get_http_proxy())
 | 
			
		||||
    aliases = {
 | 
			
		||||
        _: "env NAME=%s %s" % (_, ssh_agent)
 | 
			
		||||
        for _ in ("ssh", "sftp", "scp", "slogin", "ssh-copy-id")
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    def enable(self):
 | 
			
		||||
        cmdline("export", *merge(self.proxies))
 | 
			
		||||
        cmdline("alias", *merge(self.aliases))
 | 
			
		||||
 | 
			
		||||
    def disable(self):
 | 
			
		||||
        cmdline("unset", *self.proxies.keys())
 | 
			
		||||
        cmdline("unalias", *self.aliases.keys())
 | 
			
		||||
 | 
			
		||||
    def status(self):
 | 
			
		||||
        proxies = (
 | 
			
		||||
            "%11s = %s" % (name, os.environ[name])
 | 
			
		||||
            for name in self.proxies.keys()
 | 
			
		||||
            if name in os.environ
 | 
			
		||||
        )
 | 
			
		||||
        for _ in proxies:
 | 
			
		||||
            cmdline("echo", _)
 | 
			
		||||
 | 
			
		||||
    def usage(self):
 | 
			
		||||
        cmdline("echo", "usage: proxy {enable,disable,status}")
 | 
			
		||||
        self.status()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def cmdline(*items):
 | 
			
		||||
    print(list2cmdline(items))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def main():
 | 
			
		||||
    command = CommandSet()
 | 
			
		||||
    if len(sys.argv) == 1:
 | 
			
		||||
        command.usage()
 | 
			
		||||
        sys.exit(-1)
 | 
			
		||||
    getattr(command, sys.argv[1], command.usage)()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
if __name__ == "__main__":
 | 
			
		||||
    main()
 | 
			
		||||
							
								
								
									
										16
									
								
								plugins/shell-proxy/shell-proxy.plugin.zsh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								plugins/shell-proxy/shell-proxy.plugin.zsh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,16 @@
 | 
			
		||||
#!/usr/bin/bash
 | 
			
		||||
# shellcheck disable=SC1090
 | 
			
		||||
 | 
			
		||||
__PROXY__="${0:A:h}/proxy.py"
 | 
			
		||||
 | 
			
		||||
proxy() {
 | 
			
		||||
	source <("$__PROXY__" "$1")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
_proxy() {
 | 
			
		||||
	local -r commands=('enable' 'disable' 'status')
 | 
			
		||||
	compset -P '*,'
 | 
			
		||||
	compadd -S '' "${commands[@]}"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
compdef '_proxy' 'proxy'
 | 
			
		||||
							
								
								
									
										16
									
								
								plugins/shell-proxy/ssh-agent.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										16
									
								
								plugins/shell-proxy/ssh-agent.py
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,16 @@
 | 
			
		||||
#!/usr/bin/env python3
 | 
			
		||||
import os
 | 
			
		||||
import subprocess
 | 
			
		||||
import sys
 | 
			
		||||
 | 
			
		||||
ssh_proxy = os.path.join(os.path.dirname(__file__), "ssh-proxy.py")
 | 
			
		||||
 | 
			
		||||
argv = [
 | 
			
		||||
    os.environ.get("NAME", "ssh"),
 | 
			
		||||
    "-o",
 | 
			
		||||
    "ProxyCommand={} %h %p".format(ssh_proxy),
 | 
			
		||||
    "-o",
 | 
			
		||||
    "Compression=yes",
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
subprocess.call(argv + sys.argv[1:], env=os.environ)
 | 
			
		||||
							
								
								
									
										18
									
								
								plugins/shell-proxy/ssh-proxy.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										18
									
								
								plugins/shell-proxy/ssh-proxy.py
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,18 @@
 | 
			
		||||
#!/usr/bin/env python3
 | 
			
		||||
import os
 | 
			
		||||
import subprocess
 | 
			
		||||
import sys
 | 
			
		||||
import urllib.parse
 | 
			
		||||
 | 
			
		||||
proxy = next(os.environ[_] for _ in ("HTTP_PROXY", "HTTPS_PROXY") if _ in os.environ)
 | 
			
		||||
argv = [
 | 
			
		||||
    "nc",
 | 
			
		||||
    "-X",
 | 
			
		||||
    "connect",
 | 
			
		||||
    "-x",
 | 
			
		||||
    urllib.parse.urlparse(proxy).netloc,  # proxy-host:proxy-port
 | 
			
		||||
    sys.argv[1],  # host
 | 
			
		||||
    sys.argv[2],  # port
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
subprocess.call(argv)
 | 
			
		||||
		Reference in New Issue
	
	Block a user