ฉันจะตั้งค่าตัวแปรสภาพแวดล้อมสำหรับกระบวนการ rsync ระยะไกลได้อย่างไร


12

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


คุณจะเริ่มกระบวนการ rsync บนเซิร์ฟเวอร์ได้อย่างไร คุณสามารถเรียกสคริปต์ผ่าน ssh ได้ไหม
Kraftan

เมื่อคุณทำrsync localfilename remotehost:remotefilenameกระบวนการ rsync จะเริ่มต้นบนเซิร์ฟเวอร์ ฉันไม่แน่ใจเหมือนกัน แต่ไม่ได้อ่านไฟล์การเริ่มต้นเชลล์ใด ๆ
Ryan C. Thompson

คำตอบ:


20

~/.profileโดยทั่วไปจะไม่อ่านเมื่อคุณเรียกใช้ssh somecommandซึ่งต่างจากเซสชัน ssh แบบอินเทอร์แอคทีฟ (หรือวิธีการเข้าสู่ระบบอื่นที่คุณเริ่มเซสชันการโต้ตอบ)

Ssh รองรับการส่งตัวแปรสภาพแวดล้อม ใน OpenSSH ใช้คำสั่งในSendEnv ~/.ssh/configอย่างไรก็ตามตัวแปรสภาพแวดล้อมที่เฉพาะเจาะจงจะต้องเปิดใช้งานด้วยAcceptEnvคำสั่งในการกำหนดค่าเซิร์ฟเวอร์ดังนั้นสิ่งนี้อาจไม่ได้ผลสำหรับคุณ

OpenSSH ยังอนุญาตให้ตั้งค่าตัวแปรสภาพแวดล้อมทางฝั่งเซิร์ฟเวอร์ อีกครั้งต้องเปิดใช้งานในการกำหนดค่าเซิร์ฟเวอร์ที่นี่พร้อมกับPermitUserEnvironmentคำสั่ง ~/.ssh/environmentตัวแปรที่สามารถตั้งค่าในแฟ้ม สมมติว่าคุณใช้การรับรองความถูกต้องของกุญแจสาธารณะคุณยังสามารถตั้งค่าตัวแปรต่อคีย์ใน~/.ssh/authorized_keys: เพิ่มenvironment="FOO=bar"ที่จุดเริ่มต้นของบรรทัดที่เกี่ยวข้อง

สิ่งหนึ่งที่ฉันคิดว่าใช้งานได้เสมอ (ผิดปกติพอ) ตราบใดที่คุณใช้การพิสูจน์ตัวตนด้วยรหัสสาธารณะคือ(ab) ใช้command=ตัวเลือกในauthorized_keysไฟล์ รหัสที่มีcommandตัวเลือกนั้นดีสำหรับการเรียกใช้คำสั่งที่ระบุเท่านั้น แต่คำสั่งในauthorized_keysไฟล์จะทำงานโดยมีตัวแปรสภาพแวดล้อมSSH_ORIGINAL_COMMANDตั้งเป็นคำสั่งที่ผู้ใช้ระบุ (ว่างสำหรับเซสชันแบบโต้ตอบ) ดังนั้นคุณสามารถใช้สิ่งนี้ใน~/.ssh/authorized_keys(แน่นอนมันจะไม่ใช้ถ้าคุณไม่ใช้คีย์นี้เพื่อตรวจสอบ):

command="export LD_LIBRARY_PATH=\"$HOME\"/lib;
         if [ -n \"$SSH_ORIGINAL_COMMAND\" ]; then
           eval \"$SSH_ORIGINAL_COMMAND\";
         else exec \"$SHELL\"; fi" ssh-rsa …

โปรดทราบว่าฉันใส่ตัวแบ่งบรรทัดด้านบนเพื่อความชัดเจน แต่จริงๆแล้วต้องอยู่ในบรรทัดเดียว

ความเป็นไปได้อีกอย่างหนึ่งคือการเขียนสคริปต์ตัวตัดคำ~/bin/rsync-wrapperบนเซิร์ฟเวอร์

#!/bin/sh
. ~/.profile
exec rsync "$@"

แล้วส่งผ่าน--rsync-path='bin/rsync-wrapper'บนrsyncบรรทัดคำสั่ง อาร์กิวเมนต์--rsync-pathจะถูกขยายจากเปลือกดังนั้นหากคุณต้องการคุณสามารถทำให้บรรทัดคำสั่ง rsync --rsync-path='. ~/.profile; rsync'อยู่ในตัวเองโดยผ่านสิ่งที่ต้องการ

มีอเวนิวอีกทางหนึ่งซึ่งขึ้นอยู่กับเชลล์ล็อกอินของคุณว่าเป็น bash หรือ zsh Bash จะอ่านทุก~/.bashrcครั้งเมื่อมีการเรียกใช้โดย rshd หรือ sshd แม้ว่าจะไม่ใช่การโต้ตอบ (แต่ไม่ใช่ถ้าเรียกว่าเป็นsh) zsh ~/.zshenvเสมออ่าน

## ~/.bashrc
if [[ $- != *i* ]]; then
  # Either .bashrc was sourced explicitly, or this is an rsh/ssh session.
  . ~/.profile
fi

## ~/.zshenv
if [[ $(ps -p $PPID -o comm=) = [rs]shd && $- != *l* ]]; then
  # Not a login shell, but this is an rsh/ssh session
  . ~/.profile
fi

นั่นมันผลรวมค่อนข้างมาก ฉันหวังว่าจะมีวิธีที่ดีกว่าการใช้สคริปต์ตัวคลุม
Ryan C. Thompson

แต่เดี๋ยวก่อน หากไฟล์ shell init ของฉันไม่ถูกอ่านจะสามารถหา rsync binary บนเซิร์ฟเวอร์ได้อย่างไร ฉันติดตั้งใน ~ / usr ซึ่งเป็นตำแหน่งที่ไม่ได้มาตรฐานซึ่งฉันต้องเพิ่มลง$PATHในสคริปต์ shell init ของฉัน
Ryan C. Thompson

@ Ryan: ฉันลืมวิธีที่ตรงที่สุดที่สุด (ดูการแก้ไขของฉัน) แต่ก็ต้องมีคำสั่งเพื่อเปิดใช้งานในการกำหนดค่าเซิร์ฟเวอร์ หากคุณพบวิธีที่จะนำPATHมาพิจารณาคุณควรจะสามารถตั้งค่าตัวแปรอื่น ๆ ที่นั่น (หากวิธีนี้ใช้ไม่ได้ผลให้ลองเพิ่มร่องรอยให้มากที่สุดเท่าที่จะทำได้โดยเริ่มจากset -xเชลล์สคริปต์ใด ๆ แทนrsyncไบนารีด้วยสคริปต์ตัวตัดคำที่ทิ้งสภาพแวดล้อมลงในไฟล์จากนั้นเรียกไบนารีจริง)
Gilles 'SO - หยุดชั่วร้าย '

เกี่ยวกับ~/.ssh/rcอะไร
Ryan C. Thompson

@Ryan: ~/.ssh/rcดำเนินการโดยกระบวนการเชลล์แยกต่างหาก --rsync-path='. ~/.profile; rsync'ผมคิดว่าทางออกที่ดีที่สุดของคุณเป็นสคริปต์เสื้อคลุมหรือ หรือคอมไพล์rsyncด้วยทางลาดที่เหมาะสมตามคำถามอื่นของคุณ
Gilles 'หยุดความชั่วร้าย'
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.