{"id":13883482,"url":"https://github.com/bearstech/pussh","last_synced_at":"2025-07-27T12:25:26.832Z","repository":{"id":8538089,"uuid":"10157665","full_name":"bearstech/pussh","owner":"bearstech","description":"Parallel SSH, batch and command line oriented","archived":false,"fork":false,"pushed_at":"2025-02-12T15:43:48.000Z","size":70,"stargazers_count":84,"open_issues_count":0,"forks_count":12,"subscribers_count":12,"default_branch":"master","last_synced_at":"2025-02-12T16:42:36.402Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bearstech.png","metadata":{"files":{"readme":"README.md","changelog":"NEWS","contributing":null,"funding":null,"license":"COPYING","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2013-05-19T15:56:26.000Z","updated_at":"2025-02-12T15:43:52.000Z","dependencies_parsed_at":"2024-04-12T12:43:58.649Z","dependency_job_id":"f2cdac25-a22c-4053-8807-233e4d27edab","html_url":"https://github.com/bearstech/pussh","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/bearstech/pussh","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bearstech%2Fpussh","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bearstech%2Fpussh/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bearstech%2Fpussh/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bearstech%2Fpussh/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bearstech","download_url":"https://codeload.github.com/bearstech/pussh/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bearstech%2Fpussh/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265534510,"owners_count":23783841,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-06T09:01:34.003Z","updated_at":"2025-07-16T19:31:00.936Z","avatar_url":"https://github.com/bearstech.png","language":"Shell","funding_links":[],"categories":["Shell","others"],"sub_categories":[],"readme":"pussh\n=====\n\nParallel SSH, batch and command line oriented.\n\nBasic commands, where output is sent prefixed by the host name :\n\n    $ pussh -h host1,host2bis,... uname -a\n    host1   : Linux host1 3.2.0-4-amd64 #1 SMP Debian 3.2.41-2 x86_64 GNU/Linux\n    host2bis: Linux host2 3.2.0-3-kirkwood #1 Mon Jul 23 22:36:47 UTC 2012 armv5tel GNU/Linux\n    ...\n\nYou can fetch the host list from a file or from stdin :\n\n    $ pussh -f servers uname -a\n    $ fetch-servers | pussh -f - uname -a\n\nUse it with pipes as you would normally, for instance to sort server by rootfs usage :\n\n    $ pussh -f servers df -h / |grep /dev |sort -rn -k5\n\nOr collect per-host output, like for inventories :\n\n    $ pussh -f servers -o %h-hw.txt lshw\n\nAnd you can even pipe each SSH session output to a specific command (%h is also\navailable if you wish) :\n\n    $ pussh -f servers -o '|grep feature' command \u003eoutput\n\nObviously, you have the same features for the SSH sessions input :\n\n    $ pussh -f servers -i file command\n    $ pussh -f servers -i %h.data command\n    $ pussh -f servers -i 'get-data %h|' command\n\nYou may mix -i and -o freely.\n\nMore interestingly, you can send and execute a command in one go (but it won't\nhandle the dependencies for you, make sure your executable is self-contained or\nyour host environment is compatible with the target ones) :\n\n    $ pussh -f servers -u my-deploy.sh args ...\n\nMost of the time the total time of execution is limited by the SSH connection\nestablishment rate, and this rate is itself limited by the SSH agent. It is\nrecommended to tune your rate for a specific host and stick to it.  Exceeding\nrates generate strange connection errors (such as failed ssh-agent\nauths, 'no route to host', etc.).\n\n    $ alias pussh='pussh -r 50'\n\nSpeed is mainly sensitive to network latency. You may first login into one of\nyour remote LAN machine with ssh forwarding (ssh -A) then run 'pussh' from\nthere, the closest possible from its targets. Here is a real benchmark\non a Gigabit LAN :\n\n    $ time pussh -f servers -r 100 date\n    ...\n    Total: 201 host(s), 4 second(s)\n \n    real    0m4.069s\n    user    0m7.132s\n    sys     0m3.140s\n\n\nHistory\n-------\n\nPussh has been an internal tool at Bearstech since roughly 2008. It started\nwith 4 or 5 lines of shell and quickly evolved to its current form. It's still\nheavily used on a 500+ cluster server, and most of the time reach all of its\ntargets in about 10 seconds. It is coupled to a cloud management solution to\ngenerate a useful list of hosts from very simple descriptions.\n\n\nLimitations\n-----------\n\n* Remote's stdout and stderr ends mixed up in the same stdout stream.\n* There is no way to use the remote exit status.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbearstech%2Fpussh","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbearstech%2Fpussh","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbearstech%2Fpussh/lists"}