ชื่อเซิร์ฟเวอร์เติมข้อความอัตโนมัติสำหรับ SSH และ SCP


61

ฉันมีเซิร์ฟเวอร์ไม่กี่กำหนดค่าใน~/.ssh/configเช่นและalpha betaฉันจะกำหนดค่า Bash อย่างไรให้คำสั่งssh al<tab>และscp file.tgz al<tab>เติมชื่อของเซิร์ฟเวอร์ที่กำหนดค่าโดยอัตโนมัติ

ฉันไม่ต้องการเพิ่มเซิร์ฟเวอร์ไปยังไฟล์อื่น (เช่นอาร์เรย์ Bash) ทุกครั้งที่มีการเพิ่มเนื่องจากเราเพิ่มและลบเซิร์ฟเวอร์เป็นประจำและรายการมีขนาดค่อนข้างใหญ่


2
คุณมีแพ็คเกจ bash-completions ที่ติดตั้งไว้สำหรับ distro ของคุณหรือไม่? ฉันคิดว่านี่เป็นส่วนหนึ่งของรูทีนการทำให้เสร็จสมบูรณ์แบบมาตรฐานแม้ว่าฉันอาจสับสนกับ zsh
Caleb

การติดตั้งของฉันทำสิ่งนี้อย่างแน่นอน
slm

นี่คือ Kubuntu 12.10 และฉันbash-completionติดตั้งแล้ว
dotancohen

คำตอบ:


64

พบมัน !!

ดูเหมือนว่าใน Ubuntu รายการ~/.ssh/known_hostsที่แฮชดังนั้น SSH ที่สมบูรณ์ไม่สามารถอ่านได้ นี่คือคุณสมบัติไม่ใช่ข้อผิดพลาด แม้โดยการเพิ่มHashKnownHosts noการ~/.ssh/configและ/etc/ssh/ssh_configผมก็ไม่สามารถที่จะป้องกันไม่ให้คร่ำเครียดโฮสต์

อย่างไรก็ตามโฮสต์ที่ฉันสนใจก็มีอยู่เช่น~/.ssh/configกัน นี่คือสคริปต์สำหรับ Bash Completion ที่อ่านรายการจากไฟล์นั้น:

_ssh() 
{
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    opts=$(grep '^Host' ~/.ssh/config ~/.ssh/config.d/* 2>/dev/null | grep -v '[?*]' | cut -d ' ' -f 2-)

    COMPREPLY=( $(compgen -W "$opts" -- ${cur}) )
    return 0
}
complete -F _ssh ssh

วางสคริปต์/etc/bash_completion.d/sshนั้นแล้วแหล่งที่มาด้วยคำสั่งต่อไปนี้

$ . /etc/bash_completion.d/ssh

ฉันพบว่าคู่มือนี้มีราคาสูงและฉันจะไม่สามารถใช้สคริปต์นี้ได้หากไม่มี ขอบคุณSteve Kempสำหรับการเขียนคู่มือที่ยอดเยี่ยม!


1
ดูเหมือนว่าใน Centos 6 รายการใน ~ / .ssh / known_hosts รายการ over-ride ใน ~ / .ssh / config เช่น ถ้าคุณมี foo.bar.baz.com ใน known_hosts แล้วมันจะตรงกับทุกอย่างถ้าคุณทำ "ssh foo" <tab> - นี่เป็นสิ่งที่ไม่พึงประสงค์หากคุณมีผู้ใช้คนอื่นหรือการตั้งค่าอื่น ๆ ที่คุณต้องการใช้จาก ssh confg หากคุณมีรายการในการกำหนดค่า ssh ที่การเติมข้อความอัตโนมัติไม่ถูกต้องให้ตรวจสอบว่ามีอยู่ใน known_hosts แล้วลบออก ตอนนี้มันควรจะทำงานได้ตามปกติจากการตั้งค่า
Imran-UK

@ Imran-UK: เป็นที่ทราบกันว่า Ubuntu ไม่ได้ทำสิ่งที่สมเหตุสมผลภายใต้ข้ออ้างเรื่องความปลอดภัย เห็นได้ชัดว่าความคิดคือนิติบุคคลที่เป็นอันตรายอาจในฐานะผู้ใช้แก้ไข ~ / .ssh / config แม้จะมี chmod 0600 ในไดเรกทอรี เฮ้ฉันไม่ใช่คนที่ตัดสินใจ!
dotancohen

1
ฉันใช้ zsh & oh-my-zsh ฉันเพิ่งค้นพบว่าเปิดใช้งานปลั๊กอิน "ssh" และวาง "HashKnownHosts ใช่" ใน ~ / .ssh / config ของฉันดูเหมือนว่าจะทำสิ่งที่ถูกต้อง คุณสามารถเปลี่ยนเปลือกไม่ว่า distro ดังนั้นนี่อาจเป็นวิธีที่อยู่รอบ ๆ
Imran-UK

@ Imran-UK: อันที่จริงฉันเคยลอง zsh มาแล้วและตั้งใจจะลองอีกครั้ง ฉันจะดูว่า Shukran เพื่อนของฉัน!
dotancohen

ฉันรู้ว่าฉันมาช้าไปงานปาร์ตี้ แต่ RHEL 7 จะเติมข้อความอัตโนมัติที่อยู่ใน/etc/hostsนั้น distros อื่น ๆ อาจทำเช่นเดียวกัน
Centimane

16

ก่อนบรรจุ

คุณไม่ได้พูดว่า distro ที่คุณใช้อยู่ แต่ในระบบ Fedora 19 ของฉันฉันได้ติดตั้งแพ็คเกจต่อไปนี้bash-completionซึ่งให้ฟีเจอร์นี้ผ่านไฟล์กฎความสมบูรณ์นี้:

/usr/share/bash-completion/completions/ssh

นี่คือแพ็คเกจที่ฉันติดตั้ง:

$ rpm -aq |grep completion
bash-completion-2.1-2.fc19.noarch

หากคุณดูไฟล์กฎนั้นคุณจะเห็น stanzas ที่กำลังซักถาม$HOME/.ssh/configไฟล์:

$ grep config /usr/share/bash-completion/completions/ssh
    local configfile
    local -a config
        # Search COMP_WORDS for '-F configfile' or '-Fconfigfile' argument
                    configfile="$(dequote "${1:2}")"
                    [[ $1 ]] && configfile="$(dequote "$1")"
        _known_hosts_real -a -F "$configfile" "$cur"
    local configfile
        # Search COMP_WORDS for '-F configfile' argument
                    configfile="$(dequote "${1:2}")"
                    [[ $1 ]] && configfile="$(dequote "$1")"
        _known_hosts_real -a -F "$configfile" "$cur"
    local configfile prefix
        # Search COMP_WORDS for '-F configfile' or '-Fconfigfile' argument
                    configfile="$(dequote "${1:2}")"
                    [[ $1 ]] && configfile="$(dequote "$1")"
                _known_hosts_real -c -a -F "$configfile" "$cur"

กลิ้งของคุณเอง

ฉันยังพบ Gist นี้รู้จัก_hosts_autocomplete.shซึ่งทำสิ่งที่คล้ายกันยกเว้นกับ$HOME/.ssh/known_hostsไฟล์

# add to ~/.bash_profile, and close/reopen a shell.  Will autocomplete any
# hosts found in known_hosts.

complete -W "$(echo `cat ~/.ssh/known_hosts | cut -f 1 -d ' ' | \
    sed -e s/,.*//g | uniq | grep -v "\["`;)" ssh

คุณสามารถทำสิ่งที่คล้ายกันโดยใช้$HOME/.ssh/configไฟล์ของคุณถ้าด้วยเหตุผลบางอย่างที่คุณไม่สามารถหาไฟล์กฎความสมบูรณ์สำหรับsshการบรรจุล่วงหน้าแล้ว


ขอขอบคุณ. /usr/share/bash-completion/completions/sshมันดูเหมือนว่าอูบุนตูไม่ได้มาพร้อมกับ คุณช่วยโพสต์ไฟล์นั้นไว้ที่อื่นที่ฉันอาจจะคัดลอกได้ไหม ขอบคุณ!
dotancohen

คุณสามารถรับไฟล์ทั้งหมดจากไฟล์เก็บถาวรนี้: pkgs.fedoraproject.org/repo/pkgs/bash-completion/ ......
slm

ฉันขอโทษที่จะเจ็บปวด แต่การคัดลอกไฟล์ ssh จากไฟล์เก็บถาวร tar นั้นไป/usr/share/bash-completion/completions/sshยังไม่ช่วย! ไม่รันcomplete -W ...คำสั่งจากพรอมต์ Bash สิ่งที่อาจเป็นปัญหาที่นี่?
dotancohen

ขอขอบคุณ. สิ่งนี้ดูเหมือนจะเป็นการตัดสินใจที่รู้จักกันดีใน Ubuntu ดังนั้นฉันกำลังยอมรับคำตอบแม้ว่าฉันไม่สามารถได้รับการเสร็จสิ้นทุบตีทำงานให้หรือssh scp
dotancohen

2
Homebrew สำหรับ OSX มีสิ่งนี้: bash-completion และ zsh-completions
Adam Nelson

7

ฉันพบว่าการเติมข้อความอัตโนมัติไม่ทำงานเพราะ Ubuntu แฮ็กโฮสต์ที่รู้จัก คุณสามารถเพิ่ม

Host *
    HashKnownHosts no

ใน.ssh/configไฟล์ของคุณแต่โฮสต์ที่มีอยู่จะไม่ถูกแฮช


ขอขอบคุณ. จริงๆแล้วฉันได้เพิ่มคำสั่งนี้ไป~/.ssh/configและเปลี่ยนคำสั่งใน/etc/ssh/ssh_configและฉันได้ลบ~/.ssh/known_hostsไฟล์ หลังจากล็อกอินเข้าสู่เซิร์ฟเวอร์อีกครั้งชื่อโฮสต์ยังคงถูกบันทึกไว้ในแฮช
dotancohen

ฉันแก้ไขคำตอบของฉันแล้ว คุณจะต้องระบุโฮสต์และซ้อนคำสั่งแฮชภายใน ฉันไม่ได้ระบุว่า.ssh/configไฟล์จำนวนมากจะมีบรรทัดนี้อยู่แล้ว แจ้งให้เราทราบหากใช้งานได้
M1ke

นี่เป็นวิธีที่ง่ายที่สุดในการทำ! ระบุว่า (เวอร์ชั่นที่ใหม่กว่า) ของ Ubuntu ตอนนี้เปิดใช้งาน ssh เสร็จแล้วนี่อาจเป็นสิ่งที่ต้องการ
John Montgomery

ตามที่ฉันเพิ่มไว้ด้านล่างคุณสามารถทำสิ่งนี้ได้ แต่คุณอาจไม่ควรทำ - คุณไม่จำเป็นต้องดำเนินการจนเสร็จสิ้น อย่างไรก็ตามหากคุณไม่เห็นด้วยและต้องการยกเลิกการแฮชโฮสต์ที่มีอยู่หลังจากเพิ่มข้างต้นคุณสามารถ rm ~ / .ssh / known_hosts และนั่นจะทำให้มันถูกสร้างขึ้นใหม่ (ไม่ถูกแฮช) เมื่อใดก็ตาม คุณเข้าสู่เซิร์ฟเวอร์ใหม่
Jamieson Becker

3

วิธีเปิดใช้งานการเติมข้อความอัตโนมัติ ssh ใน Debian และ Ubuntu:

sudo apt-get install bash-completion

โปรดทราบว่าสิ่งนี้ไม่มีอะไรเกี่ยวข้องกับ hashing ที่รู้จัก _hosts ตรงข้ามกับที่กล่าวไว้ข้างต้นและคำถามเดิม หากคุณต้องการเติมข้อความอัตโนมัติจาก known_hosts แน่นอนว่าคุณจะต้องปิดการใช้งาน hashing แต่ขอแนะนำอย่างยิ่ง

ตัวอย่างเช่นฉันมี:

Host *
    HashKnownHosts yes

ใน. ssh / config ของฉันและฉันยังมีการเติมข้อมูลอัตโนมัติของ ssh ทำงานได้ดีกับโฮสต์ที่แสดงใน. ssh / config และ / etc / hosts คุณต้องเพิ่มโฮสต์ใน. ssh / config ตามที่ระบุไว้ OP:

โฮสต์ my-awesome-host Hostname the.real.host.name

(หรือคุณสามารถเพิ่มรายการโฮสต์ไปยัง / etc / hosts ซึ่งเป็นอีกหนึ่งแหล่งสำหรับสคริปต์ Debian / Ubuntu)

จากนั้นคุณสามารถพิมพ์ssh my-awe<tab>และมันจะเสร็จสมบูรณ์โดยอัตโนมัติ อีกครั้งนี่คือแม้ว่าคุณ HashKnownHosts ซึ่งแนะนำเป็นอย่างยิ่ง (โปรดทราบว่าจะต้องเปิดใช้งานการเติม bash ให้เสร็จสิ้นใน bash shell ของคุณและคุณต้องติดตั้งสคริปต์เหล่านั้นไว้ด้านบนเพื่อการแจกจ่ายของคุณโดยเฉพาะ)

จากนั้นเพิ่มบรรทัดเหล่านี้ในของคุณ.bashrcเพื่อเปิดใช้งาน (ต้องออกจากระบบและลงชื่อเข้าใช้ใหม่หรือbashพิมพ์ใหม่เพื่อเปิดใช้เชลล์ใหม่ (คุณไม่จำเป็นต้องเปิดใช้งานหากเปิดใช้งานแล้ว/etc/bash.bashrcและ/etc/profileแหล่งที่มา/etc/bash.bashrc)

if [ -f /etc/bash_completion ]; then
    . /etc/bash_completion
fi

นี้จะช่วยให้การเติมข้อความอัตโนมัติ SSH (เหนือสิ่งอื่น!) จาก~/.ssh/config, /etc/hostsฯลฯ

โปรดทราบว่า Debian จะใช้ค่าเริ่มต้นเป็นเถ้าแทนการทุบตี คุณสามารถเปลี่ยนเป็นทุบตีได้อย่างง่ายดาย:

sudo usermod -s /bin/bash "$USER"

(คุณจะต้องออกจากระบบและลงชื่อเข้าใช้ใหม่เพื่อให้การดำเนินการนี้มีผล)


2

บน Ubuntu 14.04 sshเซิร์ฟเวอร์จะทำตามที่กล่าวถึงในของคุณโดยอัตโนมัติ~/.ssh/config

ฉันสังเกตเห็นเมื่อฉันรู้ว่ามีเพียงหนึ่งในเซิร์ฟเวอร์ที่ฉันเข้าถึงโดยอัตโนมัติเสร็จสมบูรณ์ ข้อแตกต่างระหว่างสองอย่างนี้คือรายการในไฟล์ ssh config ที่เกี่ยวข้องกับการตรวจสอบความถูกต้อง เมื่อฉันเพิ่มรายการใหม่ลงในไฟล์กำหนดค่าสำหรับเซิร์ฟเวอร์อื่นรายการนั้นก็จะเริ่มทำการเติมข้อมูลให้โดยอัตโนมัติเช่นกัน

นี่คือรายการสำหรับผู้ที่ถาม:

HOST server-name 
    GSSAPIAuthentication=no

ฉันจะแปลกใจมากถ้ามันสำคัญกับสิ่งที่คุณระบุในการกำหนดค่า (ตราบใดที่มันยังใช้งานได้แน่นอน)


ขอบคุณโนอาห์สิ่งนั้นคืออะไร ในวันที่ 14.04 และ 14.10 ระบบเติมข้อความอัตโนมัติของฉันไม่ทำงาน
dotancohen

ฉันไม่คิดว่ารายการมีความสำคัญ - ฉันค่อนข้างแน่ใจว่ามันมีอยู่ในนั้น - แต่ฉันจะเพิ่มรายการในคำตอบของฉัน
โนอาห์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.